test(import): a hand-edited backup cannot raise the role or reach other accounts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
sandrodachandClaude Opus 5.5 committed 2026-11-02 21:52:00 +01:00
1 parent 3c23d094ce
commit 83bba8d20b
1 file changed
+50
+50
View File
@@ -125,6 +125,56 @@ func TestImportMindSiftJSONRoundTrip(t *testing.T) {
}
}
// A backup changed by hand cannot raise the importer's role or reach other accounts: the profile in it
// (role, id) is ignored, and notes and blocks get new IDs and no task links.
func TestImportIgnoresProfileAndForeignIDs(t *testing.T) {
store, anna, ben := newImportStore(t)
annaDoc, _ := store.CreateDocument(anna.ID, "", "Annas Notiz", "", "", []domain.DocumentBlock{{ID: "blk_anna", Type: "bullet", Content: "Original"}}, nil, false)
annaTask, _ := store.CreateThoughtWithDetails(anna.ID, "Annas Aufgabe", "normal", "manual", "", "", "todo", "")
exp := domain.FullExport{
ExportedAt: "2026-11-02T00:00:00Z",
Version: "manipuliert",
User: domain.User{ID: anna.ID, Email: anna.Email, Role: "admin", IsActive: true},
Documents: []domain.Document{{
ID: annaDoc.ID,
Title: "Übernommen?",
Blocks: []domain.DocumentBlock{
{ID: "blk_anna", Type: "bullet", Content: "Überschrieben?"},
{ID: "blk_x", Type: "todo", Content: "Verknüpft?", TaskID: annaTask.ID},
},
}},
}
data, _ := json.Marshal(exp)
plan, err := PlanMindSiftJSONImport(data)
if err != nil {
t.Fatalf("plan: %v", err)
}
if _, err := store.ApplyImport(ben.ID, plan); err != nil {
t.Fatalf("apply: %v", err)
}
if u, _ := store.GetUserByID(ben.ID); u.Role != "member" {
t.Errorf("import must not change the role, got %q", u.Role)
}
if u, _ := store.GetUserByID(anna.ID); u.Role != anna.Role {
t.Errorf("import must not touch the account named in the backup, role now %q", u.Role)
}
if d, err := store.GetDocumentByID(anna.ID, annaDoc.ID); err != nil || d.Title != "Annas Notiz" || d.Blocks[0].Content != "Original" {
t.Errorf("Anna's note must stay as it was: %+v %v", d, err)
}
docs, _ := store.GetDocuments(ben.ID)
if len(docs) != 1 || docs[0].ID == annaDoc.ID || docs[0].Title != "Übernommen?" {
t.Fatalf("the note should be Ben's own copy with a new ID: %+v", docs)
}
got, _ := store.GetDocumentByID(ben.ID, docs[0].ID)
for _, b := range got.Blocks {
if b.ID == "blk_anna" || b.ID == "blk_x" || b.TaskID != "" {
t.Errorf("imported blocks need new IDs and no task links: %+v", b)
}
}
}
func zipOf(t *testing.T, files map[string]string) []byte {
t.Helper()
var buf bytes.Buffer