erase more stuff on request

pull/8063/head
Thibault Duplessis 2021-02-01 09:22:18 +01:00
parent fc9791b1ef
commit 3da2a12cb1
7 changed files with 33 additions and 12 deletions

View File

@ -169,7 +169,12 @@ final class Env(
def cli = wire[Cli]
Bus.subscribeFun("fishnet") { case lila.hub.actorApi.fishnet.NewKey(userId, key) =>
automaticEmail.onFishnetKey(userId, key).unit
}
lila.common.Bus.subscribeFuns(
"fishnet" -> { case lila.hub.actorApi.fishnet.NewKey(userId, key) =>
automaticEmail.onFishnetKey(userId, key).unit
},
"gdprErase" -> { case lila.user.User.GDPRErase(user) =>
store.definitelyEraseAllUserInfo(user).unit
}
)
}

View File

@ -86,6 +86,9 @@ final class Store(val coll: Coll, cacheApi: lila.memo.CacheApi, localIp: IpAddre
)
.void >>- uncache(sessionId)
def definitelyEraseAllUserInfo(user: User): Funit =
coll.delete.one($doc("user" -> user)).void
def closeUserAndSessionId(userId: User.ID, sessionId: String): Funit =
coll.update
.one(

View File

@ -32,4 +32,10 @@ final class Env(
lazy val dayApi = wire[StormDayApi]
val forms = StormForm
lila.common.Bus.subscribeFuns(
"gdprErase" -> { case lila.user.User.GDPRErase(user) =>
dayApi.eraseAllFor(user).unit
}
)
}

View File

@ -103,7 +103,7 @@ final class StormDayApi(coll: Coll, highApi: StormHighApi, userRepo: UserRepo, s
Paginator(
adapter = new Adapter[StormDay](
collection = coll,
selector = $doc("_id" $startsWith s"${userId}:"),
selector = idRegexFor(userId),
projection = none,
sort = $sort desc "_id"
),
@ -111,4 +111,8 @@ final class StormDayApi(coll: Coll, highApi: StormHighApi, userRepo: UserRepo, s
MaxPerPage(30)
)
def eraseAllFor(user: User) =
coll.delete.one(idRegexFor(user.id)).void
private def idRegexFor(userId: User.ID) = $doc("_id" $startsWith s"${userId}:")
}

View File

@ -85,8 +85,7 @@ final class Env(
},
"gdprErase" -> { case User.GDPRErase(user) =>
repo erase user
noteApi erase user
()
noteApi.erase(user).unit
}
)
}

View File

@ -252,8 +252,12 @@ object User {
val totpSecret = "totp"
val changedCase = "changedCase"
val marks = "marks"
val erasedAt = "erasedAt"
val blind = "blind"
}
def withFields[A](f: BSONFields.type => A): A = f(BSONFields)
import lila.db.BSON
import lila.db.dsl._

View File

@ -625,19 +625,19 @@ final class UserRepo(val coll: Coll)(implicit ec: scala.concurrent.ExecutionCont
coll.update
.one(
$id(user.id),
$unset(F.profile) ++ $set(
"enabled" -> false,
"erasedAt" -> DateTime.now
$unset(F.profile, F.email, F.verbatimEmail, F.prevEmail, F.blind) ++ $set(
F.enabled -> false,
F.erasedAt -> DateTime.now
)
)
.void
def isErased(user: User): Fu[User.Erased] =
user.disabled ?? {
coll.exists($id(user.id) ++ $doc("erasedAt" $exists true))
coll.exists($id(user.id) ++ $doc(F.erasedAt $exists true))
} map User.Erased.apply
def byIdNotErased(id: ID): Fu[Option[User]] = coll.one[User]($id(id) ++ $doc("erasedAt" $exists false))
def byIdNotErased(id: ID): Fu[Option[User]] = coll.one[User]($id(id) ++ $doc(F.erasedAt $exists false))
def filterClosedOrInactiveIds(since: DateTime)(ids: Iterable[ID]): Fu[List[ID]] =
coll.distinctEasy[ID, List](
@ -677,7 +677,7 @@ final class UserRepo(val coll: Coll)(implicit ec: scala.concurrent.ExecutionCont
) ++ {
(email.value != normalizedEmail.value) ?? $doc(F.verbatimEmail -> email)
} ++ {
if (blind) $doc("blind" -> true) else $empty
if (blind) $doc(F.blind -> true) else $empty
}
}
}