mirror of
https://github.com/stashapp/stash.git
synced 2025-12-08 01:13:09 +01:00
Anonymise missing fields (#5244)
* Anonymise missing fields: - galleries.photographer - performers.disambiguation - gallery_urls * Anonymise captions and saved filters
This commit is contained in:
parent
f7a164ffe5
commit
5407596e0d
1 changed files with 95 additions and 8 deletions
|
|
@ -51,6 +51,7 @@ func (db *Anonymiser) Anonymise(ctx context.Context) error {
|
||||||
func() error { return db.clearWatchHistory() },
|
func() error { return db.clearWatchHistory() },
|
||||||
func() error { return db.anonymiseFolders(ctx) },
|
func() error { return db.anonymiseFolders(ctx) },
|
||||||
func() error { return db.anonymiseFiles(ctx) },
|
func() error { return db.anonymiseFiles(ctx) },
|
||||||
|
func() error { return db.anonymiseCaptions(ctx) },
|
||||||
func() error { return db.anonymiseFingerprints(ctx) },
|
func() error { return db.anonymiseFingerprints(ctx) },
|
||||||
func() error { return db.anonymiseScenes(ctx) },
|
func() error { return db.anonymiseScenes(ctx) },
|
||||||
func() error { return db.anonymiseMarkers(ctx) },
|
func() error { return db.anonymiseMarkers(ctx) },
|
||||||
|
|
@ -60,6 +61,7 @@ func (db *Anonymiser) Anonymise(ctx context.Context) error {
|
||||||
func() error { return db.anonymiseStudios(ctx) },
|
func() error { return db.anonymiseStudios(ctx) },
|
||||||
func() error { return db.anonymiseTags(ctx) },
|
func() error { return db.anonymiseTags(ctx) },
|
||||||
func() error { return db.anonymiseGroups(ctx) },
|
func() error { return db.anonymiseGroups(ctx) },
|
||||||
|
func() error { return db.anonymiseSavedFilters(ctx) },
|
||||||
func() error { return db.Optimise(ctx) },
|
func() error { return db.Optimise(ctx) },
|
||||||
})
|
})
|
||||||
}(); err != nil {
|
}(); err != nil {
|
||||||
|
|
@ -173,6 +175,20 @@ func (db *Anonymiser) anonymiseFiles(ctx context.Context) error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *Anonymiser) anonymiseCaptions(ctx context.Context) error {
|
||||||
|
logger.Infof("Anonymising captions")
|
||||||
|
return txn.WithTxn(ctx, db, func(ctx context.Context) error {
|
||||||
|
table := goqu.T(videoCaptionsTable)
|
||||||
|
stmt := dialect.Update(table).Set(goqu.Record{"filename": goqu.Cast(table.Col("file_id"), "VARCHAR")})
|
||||||
|
|
||||||
|
if _, err := exec(ctx, stmt); err != nil {
|
||||||
|
return fmt.Errorf("anonymising %s: %w", table.GetTable(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (db *Anonymiser) anonymiseFingerprints(ctx context.Context) error {
|
func (db *Anonymiser) anonymiseFingerprints(ctx context.Context) error {
|
||||||
logger.Infof("Anonymising fingerprints")
|
logger.Infof("Anonymising fingerprints")
|
||||||
table := fingerprintTableMgr.table
|
table := fingerprintTableMgr.table
|
||||||
|
|
@ -446,6 +462,7 @@ func (db *Anonymiser) anonymiseGalleries(ctx context.Context) error {
|
||||||
table.Col(idColumn),
|
table.Col(idColumn),
|
||||||
table.Col("title"),
|
table.Col("title"),
|
||||||
table.Col("details"),
|
table.Col("details"),
|
||||||
|
table.Col("photographer"),
|
||||||
).Where(table.Col(idColumn).Gt(lastID)).Limit(1000)
|
).Where(table.Col(idColumn).Gt(lastID)).Limit(1000)
|
||||||
|
|
||||||
gotSome = false
|
gotSome = false
|
||||||
|
|
@ -456,12 +473,14 @@ func (db *Anonymiser) anonymiseGalleries(ctx context.Context) error {
|
||||||
id int
|
id int
|
||||||
title sql.NullString
|
title sql.NullString
|
||||||
details sql.NullString
|
details sql.NullString
|
||||||
|
photographer sql.NullString
|
||||||
)
|
)
|
||||||
|
|
||||||
if err := rows.Scan(
|
if err := rows.Scan(
|
||||||
&id,
|
&id,
|
||||||
&title,
|
&title,
|
||||||
&details,
|
&details,
|
||||||
|
&photographer,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -469,6 +488,7 @@ func (db *Anonymiser) anonymiseGalleries(ctx context.Context) error {
|
||||||
set := goqu.Record{}
|
set := goqu.Record{}
|
||||||
db.obfuscateNullString(set, "title", title)
|
db.obfuscateNullString(set, "title", title)
|
||||||
db.obfuscateNullString(set, "details", details)
|
db.obfuscateNullString(set, "details", details)
|
||||||
|
db.obfuscateNullString(set, "photographer", photographer)
|
||||||
|
|
||||||
if len(set) > 0 {
|
if len(set) > 0 {
|
||||||
stmt := dialect.Update(table).Set(set).Where(table.Col(idColumn).Eq(id))
|
stmt := dialect.Update(table).Set(set).Where(table.Col(idColumn).Eq(id))
|
||||||
|
|
@ -493,6 +513,10 @@ func (db *Anonymiser) anonymiseGalleries(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := db.anonymiseURLs(ctx, goqu.T(galleriesURLsTable), "gallery_id"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -508,6 +532,7 @@ func (db *Anonymiser) anonymisePerformers(ctx context.Context) error {
|
||||||
query := dialect.From(table).Select(
|
query := dialect.From(table).Select(
|
||||||
table.Col(idColumn),
|
table.Col(idColumn),
|
||||||
table.Col("name"),
|
table.Col("name"),
|
||||||
|
table.Col("disambiguation"),
|
||||||
table.Col("details"),
|
table.Col("details"),
|
||||||
table.Col("tattoos"),
|
table.Col("tattoos"),
|
||||||
table.Col("piercings"),
|
table.Col("piercings"),
|
||||||
|
|
@ -520,6 +545,7 @@ func (db *Anonymiser) anonymisePerformers(ctx context.Context) error {
|
||||||
var (
|
var (
|
||||||
id int
|
id int
|
||||||
name sql.NullString
|
name sql.NullString
|
||||||
|
disambiguation sql.NullString
|
||||||
details sql.NullString
|
details sql.NullString
|
||||||
tattoos sql.NullString
|
tattoos sql.NullString
|
||||||
piercings sql.NullString
|
piercings sql.NullString
|
||||||
|
|
@ -528,6 +554,7 @@ func (db *Anonymiser) anonymisePerformers(ctx context.Context) error {
|
||||||
if err := rows.Scan(
|
if err := rows.Scan(
|
||||||
&id,
|
&id,
|
||||||
&name,
|
&name,
|
||||||
|
&disambiguation,
|
||||||
&details,
|
&details,
|
||||||
&tattoos,
|
&tattoos,
|
||||||
&piercings,
|
&piercings,
|
||||||
|
|
@ -537,6 +564,7 @@ func (db *Anonymiser) anonymisePerformers(ctx context.Context) error {
|
||||||
|
|
||||||
set := goqu.Record{}
|
set := goqu.Record{}
|
||||||
db.obfuscateNullString(set, "name", name)
|
db.obfuscateNullString(set, "name", name)
|
||||||
|
db.obfuscateNullString(set, "disambiguation", disambiguation)
|
||||||
db.obfuscateNullString(set, "details", details)
|
db.obfuscateNullString(set, "details", details)
|
||||||
db.obfuscateNullString(set, "tattoos", tattoos)
|
db.obfuscateNullString(set, "tattoos", tattoos)
|
||||||
db.obfuscateNullString(set, "piercings", piercings)
|
db.obfuscateNullString(set, "piercings", piercings)
|
||||||
|
|
@ -914,6 +942,65 @@ func (db *Anonymiser) anonymiseGroups(ctx context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *Anonymiser) anonymiseSavedFilters(ctx context.Context) error {
|
||||||
|
logger.Infof("Anonymising saved filters")
|
||||||
|
table := savedFilterTableMgr.table
|
||||||
|
lastID := 0
|
||||||
|
total := 0
|
||||||
|
const logEvery = 10000
|
||||||
|
|
||||||
|
for gotSome := true; gotSome; {
|
||||||
|
if err := txn.WithTxn(ctx, db, func(ctx context.Context) error {
|
||||||
|
query := dialect.From(table).Select(
|
||||||
|
table.Col(idColumn),
|
||||||
|
table.Col("name"),
|
||||||
|
).Where(table.Col(idColumn).Gt(lastID)).Limit(1000)
|
||||||
|
|
||||||
|
gotSome = false
|
||||||
|
|
||||||
|
const single = false
|
||||||
|
return queryFunc(ctx, query, single, func(rows *sqlx.Rows) error {
|
||||||
|
var (
|
||||||
|
id int
|
||||||
|
name sql.NullString
|
||||||
|
)
|
||||||
|
|
||||||
|
if err := rows.Scan(
|
||||||
|
&id,
|
||||||
|
&name,
|
||||||
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
set := goqu.Record{}
|
||||||
|
db.obfuscateNullString(set, "name", name)
|
||||||
|
|
||||||
|
if len(set) > 0 {
|
||||||
|
stmt := dialect.Update(table).Set(set).Where(table.Col(idColumn).Eq(id))
|
||||||
|
|
||||||
|
if _, err := exec(ctx, stmt); err != nil {
|
||||||
|
return fmt.Errorf("anonymising %s: %w", table.GetTable(), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastID = id
|
||||||
|
gotSome = true
|
||||||
|
total++
|
||||||
|
|
||||||
|
if total%logEvery == 0 {
|
||||||
|
logger.Infof("Anonymised %d saved filters", total)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (db *Anonymiser) anonymiseText(ctx context.Context, table exp.IdentifierExpression, column string, value string) error {
|
func (db *Anonymiser) anonymiseText(ctx context.Context, table exp.IdentifierExpression, column string, value string) error {
|
||||||
set := goqu.Record{}
|
set := goqu.Record{}
|
||||||
set[column] = db.obfuscateString(value, letters)
|
set[column] = db.obfuscateString(value, letters)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue