Skip to content

Commit ceebe6c

Browse files
committed
Allowing a pre-established set of compiler flags
1 parent da2b1af commit ceebe6c

File tree

2 files changed

+84
-40
lines changed

2 files changed

+84
-40
lines changed

server/src/main/resources/application.conf

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,28 @@ eval.auth {
1212

1313
# Loader IO Configuration
1414
loaderio.verificationToken=loaderio-changeme
15-
loaderio.verificationToken=${?LOADERIO_VERIFICATION_TOKEN}
15+
loaderio.verificationToken=${?LOADERIO_VERIFICATION_TOKEN}
16+
17+
allowed.compiler{
18+
flags = ["-deprecation",
19+
"-encoding", "UTF-8",
20+
"-feature",
21+
"-language:existentials",
22+
"-language:experimental.macros",
23+
"-language:higherKinds",
24+
"-language:implicitConversions",
25+
"-language:reflectiveCalls",
26+
"-unchecked",
27+
"-Xfatal-warnings",
28+
"-Xfuture",
29+
"-Xlint",
30+
"-Xplugin-require:macroparadise",
31+
"-Yinline-warnings",
32+
"-Yliteral-types",
33+
"-Yno-adapted-args",
34+
"-Ywarn-dead-code",
35+
"-Ywarn-numeric-widen",
36+
"-Ywarn-value-discard",
37+
"-Ypartial-unification"]
38+
flags = ${?ALLOWED_COMPILER_FLAGS}
39+
}

server/src/main/scala/org/scalaexercises/evaluator/services.scala

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package org.scalaexercises.evaluator
77

8+
import com.typesafe.config.ConfigFactory
89
import io.circe.Decoder
910
import monix.execution.Scheduler
1011
import org.http4s._
1112
import org.http4s.dsl._
1213
import org.http4s.server.blaze._
1314
import org.log4s.getLogger
1415

16+
import scala.collection.JavaConversions._
1517
import scala.concurrent.duration._
1618
import scala.language.postfixOps
1719

@@ -23,6 +25,17 @@ object services {
2325

2426
private val logger = getLogger
2527

28+
val config = ConfigFactory.load()
29+
30+
val AllowedCompilerFlags = "allowed.compiler.flags"
31+
32+
val allowedCompilerFlags = if (config.hasPath(AllowedCompilerFlags)) {
33+
config.getStringList(AllowedCompilerFlags).toList
34+
} else {
35+
throw new IllegalStateException(
36+
"Missing -D allowed.compiler.flags=[YOUR_KEY_HERE] or env var [ALLOWED_COMPILER_FLAGS]")
37+
}
38+
2639
implicit val scheduler: Scheduler = Scheduler.io("scala-evaluator")
2740

2841
val evaluator = new Evaluator(20 seconds)
@@ -68,45 +81,52 @@ object services {
6881
req
6982
.decodeWith[EvalRequest](decoder, strict = false) {
7083
evalRequest =>
71-
evaluator.eval[Any](
72-
code = evalRequest.code,
73-
remotes = evalRequest.resolvers,
74-
dependencies = evalRequest.dependencies,
75-
compilerFlags = evalRequest.compilerFlags
76-
) flatMap {
77-
(result: EvalResult[_]) =>
78-
val response = result match {
79-
case EvalSuccess(cis, res, out) =>
80-
EvalResponse(
81-
`ok`,
82-
Option(res.toString),
83-
Option(res.asInstanceOf[AnyRef].getClass.getName),
84-
cis)
85-
case Timeout(_) =>
86-
EvalResponse(`Timeout Exceded`, None, None, Map.empty)
87-
case UnresolvedDependency(msg) =>
88-
EvalResponse(
89-
`Unresolved Dependency` + " : " + msg,
90-
None,
91-
None,
92-
Map.empty)
93-
case EvalRuntimeError(cis, runtimeError) =>
94-
EvalResponse(
95-
`Runtime Error`,
96-
runtimeError map (_.error.getMessage),
97-
runtimeError map (_.error.getClass.getName),
98-
cis)
99-
case CompilationError(cis) =>
100-
EvalResponse(`Compilation Error`, None, None, cis)
101-
case GeneralError(err) =>
102-
EvalResponse(
103-
`Unforeseen Exception`,
104-
None,
105-
None,
106-
Map.empty)
107-
}
108-
Ok(response.asJson)
109-
}
84+
val (validCompilerFlags, invalidCompilerFlags) =
85+
evalRequest.compilerFlags.partition(
86+
allowedCompilerFlags.contains(_))
87+
if (invalidCompilerFlags.isEmpty) {
88+
evaluator.eval[Any](
89+
code = evalRequest.code,
90+
remotes = evalRequest.resolvers,
91+
dependencies = evalRequest.dependencies,
92+
compilerFlags = validCompilerFlags
93+
) flatMap {
94+
(result: EvalResult[_]) =>
95+
val response = result match {
96+
case EvalSuccess(cis, res, out) =>
97+
EvalResponse(
98+
`ok`,
99+
Option(res.toString),
100+
Option(res.asInstanceOf[AnyRef].getClass.getName),
101+
cis)
102+
case Timeout(_) =>
103+
EvalResponse(`Timeout Exceded`, None, None, Map.empty)
104+
case UnresolvedDependency(msg) =>
105+
EvalResponse(
106+
`Unresolved Dependency` + " : " + msg,
107+
None,
108+
None,
109+
Map.empty)
110+
case EvalRuntimeError(cis, runtimeError) =>
111+
EvalResponse(
112+
`Runtime Error`,
113+
runtimeError map (_.error.getMessage),
114+
runtimeError map (_.error.getClass.getName),
115+
cis)
116+
case CompilationError(cis) =>
117+
EvalResponse(`Compilation Error`, None, None, cis)
118+
case GeneralError(err) =>
119+
EvalResponse(
120+
`Unforeseen Exception`,
121+
None,
122+
None,
123+
Map.empty)
124+
}
125+
Ok(response.asJson)
126+
}
127+
} else
128+
BadRequest(
129+
s"Invalid compiler flags: ${invalidCompilerFlags.mkString(",")}")
110130
}
111131
.map((r: Response) => r.putHeaders(corsHeaders: _*))
112132
})

0 commit comments

Comments
 (0)