Skip to content

Commit 5158e54

Browse files
authored
Log invalid registration topic types (#1830)
* log invalid topic id and type * add logging to non-legacy * better loging * use MDC
1 parent aeee747 commit 5158e54

3 files changed

Lines changed: 38 additions & 6 deletions

File tree

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package models
22

3-
import play.api.libs.json.{Format, Json}
3+
import org.slf4j.MDC
4+
import play.api.libs.json._
45

56
case class Registration(
67
deviceToken: DeviceToken,
@@ -11,5 +12,24 @@ case class Registration(
1112
)
1213

1314
object Registration {
14-
implicit val registrationJF: Format[Registration] = Json.format[Registration]
15-
}
15+
implicit val registrationJF: Format[Registration] = {
16+
val base = Json.format[Registration]
17+
Format(
18+
Reads { json =>
19+
val invalid = (json \ "topics").asOpt[JsArray].toSeq.flatMap { arr =>
20+
arr.value.flatMap { v =>
21+
if (v.validate[Topic].isError) {
22+
val topicType = (v \ "type").asOpt[String].getOrElse("unknown")
23+
val topicName = (v \ "name").asOpt[String].getOrElse("unknown")
24+
Some(s"Topic Type=$topicType (Topic Id=$topicName)")
25+
} else None
26+
}
27+
}
28+
if (invalid.nonEmpty)
29+
MDC.put("invalidTopics", invalid.mkString(". "))
30+
base.reads(json)
31+
},
32+
base
33+
)
34+
}
35+
}

registration/app/registration/CustomErrorHandler.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package registration
22

3-
import org.slf4j.{Logger, LoggerFactory}
3+
import org.slf4j.{Logger, LoggerFactory, MDC}
44
import play.api._
55
import play.api.http.DefaultHttpErrorHandler
66
import play.api.mvc.Results._
@@ -14,7 +14,13 @@ class CustomErrorHandler(env: Environment, config: Configuration, sourceMapper:
1414
private val logger: Logger = LoggerFactory.getLogger(this.getClass)
1515
override def onBadRequest(request: RequestHeader, message: String): Future[Result] = {
1616
val debugInfo = request.headers.get("User-Agent")
17-
logger.error(s"Bad request due to $message. User agent = $debugInfo")
17+
Option(MDC.get("invalidTopics")) match {
18+
case Some(invalidTopics) =>
19+
logger.warn(s"Bad request: request contains invalid topic type(s). $invalidTopics. User agent = $debugInfo")
20+
MDC.remove("invalidTopics")
21+
case None =>
22+
logger.error(s"Bad request due to $message. User agent = $debugInfo")
23+
}
1824
Future.successful(BadRequest("Bad request"))
1925
}
2026
}

registration/app/registration/services/LegacyRegistrationConverter.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import registration.models.LegacyTopic
55
import models._
66
import registration.models.LegacyRegistration
77
import cats.syntax.all._
8+
import org.slf4j.LoggerFactory
89

910
class LegacyRegistrationConverter extends RegistrationConverter[LegacyRegistration] {
1011

12+
private val logger = LoggerFactory.getLogger(this.getClass)
13+
1114
def toRegistration(legacyRegistration: LegacyRegistration): Either[NotificationsError, Registration] = {
1215

1316
def deviceTokenFromRegistration(platform: Platform): Either[NotificationsError, DeviceToken] = {
@@ -57,7 +60,10 @@ class LegacyRegistrationConverter extends RegistrationConverter[LegacyRegistrati
5760
val topics = for {
5861
topics <- request.preferences.topics.toList
5962
topic <- topics
60-
topicType <- TopicType.fromString(topic.`type`)
63+
topicType <- TopicType.fromString(topic.`type`) orElse {
64+
logger.warn(s"Invalid topic type=${topic.`type`} topic id=${topic.name}")
65+
None
66+
}
6167
} yield Topic(topicType, topic.name) // todo: check this
6268

6369
val matchTopics = for {

0 commit comments

Comments
 (0)