Skip to content

Commit 44193d5

Browse files
committed
Fixed jaliss#601: Security: password reset email host injection
1 parent 4826484 commit 44193d5

File tree

7 files changed

+31
-11
lines changed

7 files changed

+31
-11
lines changed

ChangeLog

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
master -
2+
- Fixed #601: Security: password reset email host injection
13
3.0-M6 - 2017-02-17
24
- Upgraded to Play 2.5.12
35
3.0-M5 - 2017-02-17

module-code/app/securesocial/core/RuntimeEnvironment.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ object RuntimeEnvironment {
5656
* You can start your app with with by only adding a userService to handle users.
5757
*/
5858
abstract class Default extends RuntimeEnvironment {
59-
override lazy val routes: RoutesService = new RoutesService.Default()
59+
override lazy val routes: RoutesService = new RoutesService.Default(configuration)
6060

6161
override lazy val viewTemplates: ViewTemplates = new ViewTemplates.Default(this)(configuration)
6262
override lazy val mailTemplates: MailTemplates = new MailTemplates.Default(this)

module-code/app/securesocial/core/services/RoutesService.scala

+12-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package securesocial.core.services
1818

19+
import play.api.Configuration
1920
import play.api.mvc.{ Call, RequestHeader }
2021
import securesocial.core.IdentityProvider
2122

@@ -99,20 +100,25 @@ object RoutesService {
99100
* The default RoutesService implementation. It points to the routes
100101
* defined by the built in controllers.
101102
*/
102-
class Default extends RoutesService {
103+
class Default(configuration: Configuration) extends RoutesService {
103104
private val logger = play.api.Logger("securesocial.core.DefaultRoutesService")
104-
lazy val conf = play.api.Play.current.configuration
105-
106105
val FaviconKey = "securesocial.faviconPath"
107106
val JQueryKey = "securesocial.jqueryPath"
108107
val BootstrapCssKey = "securesocial.bootstrapCssPath"
109108
val CustomCssKey = "securesocial.customCssPath"
110109
val DefaultFaviconPath = "images/favicon.png"
111110
val DefaultJqueryPath = "javascripts/jquery-1.7.1.min.js"
112111
val DefaultBootstrapCssPath = "bootstrap/css/bootstrap.min.css"
112+
val ApplicationHostKey = "securesocial.applicationHost"
113+
val ApplicationPortKey = "securesocial.applicationPort"
114+
private lazy val applicationHost = configuration.getString(ApplicationHostKey).getOrElse {
115+
throw new RuntimeException(s"Missing property: $ApplicationHostKey")
116+
}
117+
private lazy val applicationPort = configuration.getInt(ApplicationPortKey).map(port => s":$port").getOrElse("")
118+
private lazy val hostAndPort = s"$applicationHost$applicationPort"
113119

114120
protected def absoluteUrl(call: Call)(implicit req: RequestHeader): String = {
115-
call.absoluteURL(IdentityProvider.sslEnabled)
121+
call.absoluteURL(IdentityProvider.sslEnabled, hostAndPort)
116122
}
117123

118124
override def loginPageUrl(implicit req: RequestHeader): String = {
@@ -168,7 +174,7 @@ object RoutesService {
168174
}
169175

170176
protected def valueFor(key: String, default: String) = {
171-
val value = conf.getString(key).getOrElse(default)
177+
val value = configuration.getString(key).getOrElse(default)
172178
logger.debug(s"[securesocial] $key = $value")
173179
securesocial.controllers.routes.Assets.at(value)
174180
}
@@ -195,7 +201,7 @@ object RoutesService {
195201
* @return Option containing a custom css file or None
196202
*/
197203
override val customCssPath: Option[Call] = {
198-
val path = conf.getString(CustomCssKey).map(securesocial.controllers.routes.Assets.at)
204+
val path = configuration.getString(CustomCssKey).map(securesocial.controllers.routes.Assets.at)
199205
logger.debug("[securesocial] custom css path = %s".format(path))
200206
path
201207
}

samples/java/demo/conf/securesocial.conf

+6
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ securesocial {
8585
#
8686
ssl=false
8787

88+
#
89+
# The application host and optional port are used to compute the URLs users are pointed to.
90+
# (see RoutesService.Default.absoluteUrl)
91+
#
92+
applicationHost=localhost
93+
applicationPort=9000
8894

8995
#
9096
# Parameters for the cookie used to track users.

samples/scala/demo/app/controllers/CustomLoginController.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import javax.inject.Inject
44

55
import securesocial.controllers.BaseLoginPage
66
import play.api.mvc.{ Action, AnyContent, RequestHeader }
7-
import play.api.Logger
7+
import play.api.{ Configuration, Logger }
88
import play.filters.csrf.CSRFAddToken
99
import securesocial.core.{ IdentityProvider, RuntimeEnvironment }
1010
import securesocial.core.services.RoutesService
@@ -16,6 +16,6 @@ class CustomLoginController @Inject() (val csrfAddToken: CSRFAddToken, implicit
1616
}
1717
}
1818

19-
class CustomRoutesService extends RoutesService.Default {
20-
override def loginPageUrl(implicit req: RequestHeader): String = controllers.routes.CustomLoginController.login().absoluteURL(IdentityProvider.sslEnabled)
19+
class CustomRoutesService(configuration: Configuration) extends RoutesService.Default(configuration) {
20+
override def loginPageUrl(implicit req: RequestHeader): String = absoluteUrl(controllers.routes.CustomLoginController.login())
2121
}

samples/scala/demo/app/service/MyEnvironment.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import securesocial.core.RuntimeEnvironment
2828
class MyEnvironment @Inject() (override val configuration: Configuration, override val messagesApi: MessagesApi) extends RuntimeEnvironment.Default {
2929
override type U = DemoUser
3030
override implicit val executionContext = play.api.libs.concurrent.Execution.defaultContext
31-
override lazy val routes = new CustomRoutesService()
31+
override lazy val routes = new CustomRoutesService(configuration)
3232
override lazy val userService: InMemoryUserService = new InMemoryUserService()
3333
override lazy val eventListeners = List(new MyEventListener())
3434
}

samples/scala/demo/conf/securesocial.conf

+6
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ securesocial {
8585
#
8686
ssl=false
8787

88+
#
89+
# The application host and optional port are used to compute the URLs users are pointed to.
90+
# (see RoutesService.Default.absoluteUrl)
91+
#
92+
applicationHost=localhost
93+
applicationPort=9000
8894

8995
#
9096
# Parameters for the cookie used to track users.

0 commit comments

Comments
 (0)