Skip to content

Commit e58cd54

Browse files
committed
Also remove Web Push subscription on token revocation by origin for
mobile scope. This is because the mobile app can use Unified Push.
1 parent 986b388 commit e58cd54

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

app/controllers/OAuth.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,12 @@ final class OAuth(env: Env, apiC: => Api) extends LilaController(env):
111111
def revokeClient = AuthBody { ctx ?=> _ ?=>
112112
bindForm(lila.oauth.AccessTokenRequest.revokeClientForm)(
113113
_ => BadRequest,
114-
origin => env.oAuth.tokenApi.revokeByClientOrigin(origin).inject(NoContent)
114+
origin =>
115+
for
116+
tokens <- env.oAuth.tokenApi.revokeByClientOrigin(origin)
117+
_ <- ctx.isMobileOauth.soFu:
118+
tokens.traverse(token => env.push.webSubscriptionApi.unsubscribeBySession(token.value))
119+
yield NoContent
115120
)
116121
}
117122

modules/oauth/src/main/AccessTokenApi.scala

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,29 @@ final class AccessTokenApi(
176176
.runWith(Sink.ignore)
177177
.void
178178

179-
def revokeByClientOrigin(clientOrigin: String)(using me: MyId): Funit =
180-
coll
181-
.find(
182-
$doc(
183-
F.userId -> me,
184-
F.clientOrigin -> clientOrigin
185-
),
186-
$doc(F.id -> 1).some
187-
)
188-
.sort($sort.desc(F.usedAt))
189-
.cursor[Bdoc]()
190-
.list(100)
191-
.flatMap: invalidate =>
192-
coll.delete
193-
.one:
194-
$doc(
195-
F.userId -> me,
196-
F.clientOrigin -> clientOrigin
197-
)
198-
.map(_ => invalidate.flatMap(_.getAsOpt[AccessToken.Id](F.id)).foreach(onRevoke))
179+
def revokeByClientOrigin(clientOrigin: String)(using me: MyId): Fu[List[AccessToken.Id]] =
180+
for
181+
tokens <- coll
182+
.find(
183+
$doc(
184+
F.userId -> me,
185+
F.clientOrigin -> clientOrigin
186+
),
187+
$doc(F.id -> 1).some
188+
)
189+
.sort($sort.desc(F.usedAt))
190+
.cursor[Bdoc]()
191+
.list(100)
192+
.flatMap: invalidate =>
193+
coll.delete
194+
.one:
195+
$doc(
196+
F.userId -> me,
197+
F.clientOrigin -> clientOrigin
198+
)
199+
.map(_ => invalidate.flatMap(_.getAsOpt[AccessToken.Id](F.id)))
200+
_ = tokens.foreach(onRevoke(_))
201+
yield tokens
199202

200203
def revoke(bearer: Bearer) =
201204
val id = AccessToken.Id.from(bearer)

0 commit comments

Comments
 (0)