First version of working redaction with passing integration tests

This commit is contained in:
David Dworken
2022-09-19 22:49:48 -07:00
parent afe1fc5043
commit 5391ecd220
6 changed files with 347 additions and 44 deletions

View File

@ -1101,3 +1101,70 @@ func EncryptAndMarshal(config ClientConfig, entry *data.HistoryEntry) ([]byte, e
}
return jsonValue, nil
}
func Redact(db *gorm.DB, query string, force bool) error {
tx, err := data.MakeWhereQueryFromSearch(db, query)
if err != nil {
return err
}
var historyEntries []*data.HistoryEntry
res := tx.Find(&historyEntries)
if res.Error != nil {
return res.Error
}
if force {
fmt.Printf("Permanently deleting %d entries", len(historyEntries))
} else {
// TODO: Find a way to test the prompting
fmt.Printf("This will permanently delete %d entries, are you sure? [y/N]", len(historyEntries))
reader := bufio.NewReader(os.Stdin)
resp, err := reader.ReadString('\n')
if err != nil {
return fmt.Errorf("failed to read response: %v", err)
}
if strings.TrimSpace(resp) != "y" {
fmt.Printf("Aborting delete per user response of %#v\n", strings.TrimSpace(resp))
return nil
}
}
tx, err = data.MakeWhereQueryFromSearch(db, query)
if err != nil {
return err
}
res = tx.Delete(&data.HistoryEntry{})
if res.Error != nil {
return res.Error
}
if res.RowsAffected != int64(len(historyEntries)) {
return fmt.Errorf("DB deleted %d rows, when we only expected to delete %d rows, something may have gone wrong", res.RowsAffected, len(historyEntries))
}
err = deleteOnRemoteInstances(historyEntries)
if err != nil {
return err
}
return nil
}
func deleteOnRemoteInstances(historyEntries []*data.HistoryEntry) error {
config, err := GetConfig()
if err != nil {
return err
}
var deletionRequest shared.DeletionRequest
deletionRequest.SendTime = time.Now()
deletionRequest.UserId = data.UserId(config.UserSecret)
for _, entry := range historyEntries {
deletionRequest.Messages.Ids = append(deletionRequest.Messages.Ids, shared.MessageIdentifier{Date: entry.EndTime, DeviceId: entry.DeviceId})
}
data, err := json.Marshal(deletionRequest)
if err != nil {
return err
}
_, err = ApiPost("/api/v1/add-deletion-request", "application/json", data)
if err != nil {
return fmt.Errorf("failed to send deletion request to backend service, this may cause commands to not get deleted on other instances of hishtory: %v", err)
}
return nil
}