Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit e1be5c8

Browse files
committed
Fixed a security issue in file system actor allowing to break out of the folder sandbox. Implemented get requests for http actor.
1 parent 83ebeb1 commit e1be5c8

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.codeoverflow.chatoverflow.connector.actor
22

33
import java.io.PrintWriter
4+
import java.nio.file.Paths
45

56
import akka.actor.Actor
67

@@ -12,7 +13,7 @@ import scala.io.Source
1213
class FileSystemActor extends Actor {
1314

1415
// TODO: Subject of change?
15-
private val resourceFilePath = "src/main/resources/"
16+
private val resourceFilePath = "src/main/resources"
1617

1718
/**
1819
* Receives either LoadFile or SaveFile object, acts accordingly.
@@ -38,7 +39,8 @@ class FileSystemActor extends Actor {
3839
}
3940

4041
private def fixPath(path: String): String = {
41-
path.replace("../", "").replace("..\\", "")
42+
val fixedPath = Paths.get("/", path).normalize()
43+
fixedPath.toString
4244
}
4345
}
4446

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,51 @@
11
package org.codeoverflow.chatoverflow.connector.actor
22

33
import akka.actor.Actor
4+
import org.apache.http.client.methods.HttpGet
5+
import org.apache.http.client.utils.URIBuilder
6+
import org.apache.http.impl.client.HttpClientBuilder
7+
import org.apache.http.util.EntityUtils
48

9+
/**
10+
* The HttpActor can be used to handle http requests.
11+
*/
512
class HttpActor extends Actor {
6-
override def receive: Receive = ???
13+
private val client = HttpClientBuilder.create.build
14+
15+
/**
16+
* Send a GetRequest-Object to perform a http get request.
17+
*
18+
* @return the http request answer as some string or none
19+
*/
20+
override def receive: Receive = {
21+
case GetRequest(uri, settings, queryParams) =>
22+
try {
23+
var httpGet = new HttpGet(uri)
24+
httpGet = settings(httpGet)
25+
26+
val urlBuilder = new URIBuilder(httpGet.getURI)
27+
queryParams.foreach(param => urlBuilder.addParameter(param._1, param._2))
28+
httpGet.setURI(urlBuilder.build())
29+
30+
val entity = client.execute(httpGet).getEntity
31+
if (entity != null) {
32+
sender ! Some(EntityUtils.toString(entity, "UTF-8"))
33+
} else {
34+
sender ! None
35+
}
36+
} catch {
37+
case _: Exception => None
38+
}
39+
}
740
}
41+
42+
/**
43+
* A get request consists of a URI at least. Http (e.g. header) settings and query parameters are optional.
44+
*
45+
* @param uri the web address incl. the protocol you want to request
46+
* @param settings a function manipulating the generated HttpGet-Element, e.g. by adding header-entries
47+
* @param queryParams the query params as sequence of key-value-tuple
48+
*/
49+
case class GetRequest(uri: String,
50+
settings: HttpGet => HttpGet = httpGet => httpGet,
51+
queryParams: Seq[(String, String)] = Seq[(String, String)]())

0 commit comments

Comments
 (0)