send impersonation events to lila-ws

round-remote-socket
Thibault Duplessis 2019-11-10 14:19:42 -06:00
parent 6eb430e163
commit 106c20f397
6 changed files with 18 additions and 7 deletions

View File

@ -435,7 +435,7 @@ private[controllers] trait LilaController
case d => d
} flatMap {
case None => fuccess(None -> None)
case Some(d) => lila.mod.Impersonate.impersonating(d.user) map {
case Some(d) => Env.mod.impersonate.impersonating(d.user) map {
_.fold[RestoredUser](d.some -> None) { impersonated =>
FingerPrintedUser(impersonated, FingerHash.impersonate.some).some -> d.user.some
}

View File

@ -120,12 +120,12 @@ object Mod extends LilaController {
}(actionResult(username))
def impersonate(username: String) = Auth { implicit ctx => me =>
if (username == "-" && lila.mod.Impersonate.isImpersonated(me)) fuccess {
lila.mod.Impersonate.stop(me)
if (username == "-" && Env.mod.impersonate.isImpersonated(me)) fuccess {
Env.mod.impersonate.stop(me)
Redirect(routes.User.show(me.username))
}
else if (isGranted(_.Impersonate)) OptionFuRedirect(UserRepo named username) { user =>
lila.mod.Impersonate.start(me, user)
Env.mod.impersonate.start(me, user)
fuccess(routes.User.show(user.username))
}
else notFound

View File

@ -82,6 +82,7 @@ package mod {
case class KickFromRankings(userId: String)
case class SetPermissions(userId: String, permissions: List[String])
case class AutoWarning(userId: String, subject: String)
case class Impersonate(userId: String, by: Option[String])
}
package playban {

View File

@ -44,6 +44,8 @@ final class Env(
lazy val logApi = new ModlogApi(logColl)
lazy val impersonate = new ImpersonateApi(system.lilaBus)
private lazy val notifier = new ModNotifier(notifyApi, reportApi)
private lazy val ratingRefund = new RatingRefund(

View File

@ -2,8 +2,9 @@ package lila.mod
import lila.user.{ User, UserRepo }
import lila.security.Granter
import lila.hub.actorApi.mod.Impersonate
object Impersonate {
final class ImpersonateApi(bus: lila.common.Bus) {
private var modToUser = Map.empty[User.ID, User.ID]
private var userToMod = Map.empty[User.ID, User.ID]
@ -13,12 +14,14 @@ object Impersonate {
modToUser = modToUser + (mod.id -> user.id)
userToMod = userToMod + (user.id -> mod.id)
logger.info(s"${mod.username} starts impersonating ${user.username}")
bus.publish(Impersonate(user.id, mod.id.some), 'impersonate)
}
def stop(user: User): Unit = userToMod.get(user.id) ?? { modId =>
modToUser = modToUser - modId
userToMod = userToMod - user.id
logger.info(s"${modId} stops impersonating ${user.username}")
bus.publish(Impersonate(user.id, none), 'impersonate)
}
def impersonating(mod: User): Fu[Option[User]] = modToUser.get(mod.id) ?? UserRepo.byId

View File

@ -77,7 +77,7 @@ final class RemoteSocket(
})
}
bus.subscribeFun('moveEvent, 'socketUsers, 'deploy, 'announce, 'mlat, 'sendToFlag, 'remoteSocketOut, 'accountClose, 'shadowban) {
bus.subscribeFun('moveEvent, 'socketUsers, 'deploy, 'announce, 'mlat, 'sendToFlag, 'remoteSocketOut, 'accountClose, 'shadowban, 'impersonate) {
case MoveEvent(gameId, fen, move) =>
if (watchedGameIds(gameId)) send(Out.move(gameId, move, fen))
case SendTos(userIds, payload) =>
@ -101,6 +101,8 @@ final class RemoteSocket(
f(connectedUserIds.get)
case lila.hub.actorApi.mod.Shadowban(userId, v) =>
send(Out.setTroll(userId, v))
case lila.hub.actorApi.mod.Impersonate(userId, modId) =>
send(Out.impersonate(userId, modId))
}
private def tick(nbConn: Int): Unit = {
@ -252,11 +254,14 @@ object RemoteSocket {
def disconnectUser(userId: String) =
s"disconnect/user $userId"
def setTroll(userId: String, v: Boolean) =
s"troll/set $userId ${boolean(v)}"
s"mod/troll/set $userId ${boolean(v)}"
def impersonate(userId: String, by: Option[String]) =
s"mod/impersonate $userId ${optional(by)}"
def commas(strs: Iterable[Any]): String = if (strs.isEmpty) "-" else strs mkString ","
def boolean(v: Boolean): String = if (v) "+" else "-"
def color(c: chess.Color): String = c.fold("w", "b")
def optional(str: Option[String]) = str getOrElse "-"
}
}