@@ -18,55 +18,84 @@ class Server(
1818 port : Int ,
1919 captchaManager : CaptchaManager ,
2020 playgroundEnabled : Boolean ,
21- corsHeader : String
21+ corsHeader : String ,
22+ authRequired : Boolean = false ,
23+ authKey : Option [String ] = None
2224) {
2325 var headerMap : util.Map [String , util.List [String ]] = null
2426 if (corsHeader.nonEmpty) {
2527 headerMap = Map (" Access-Control-Allow-Origin" -> List (corsHeader).asJava).asJava
2628 }
29+
30+ private def checkAuth (request : picoserve.Server # Request ): Boolean = {
31+ if (! authRequired) return true
32+ val headers = request.getHeaders()
33+ if (headers != null && headers.containsKey(" Auth" )) {
34+ val authHeaderValues = headers.get(" Auth" )
35+ if (authHeaderValues != null && authHeaderValues.size() > 0 ) {
36+ val authHeader = authHeaderValues.get(0 )
37+ val expectedKey = authKey.getOrElse(" " )
38+ return authHeader == expectedKey
39+ }
40+ }
41+ false
42+ }
43+
2744 val serverBuilder : ServerBuilder = picoserve.Server
2845 .builder()
2946 .address(new InetSocketAddress (address, port))
3047 .backlog(32 )
3148 .POST (
3249 " /v2/captcha" ,
3350 (request) => {
34- val bodyStr = request.getBodyString().trim.replaceAll(" \u0000 " , " " )
35- val paramEither = Parameters .codec.decode(ByteBuffer .wrap(bodyStr.getBytes(" UTF-8" )))
36- paramEither match {
37- case Right (param) =>
38- val id = captchaManager.getChallenge(param)
39- getResponse(id, headerMap)
40- case Left (err) =>
41- getResponse(Left (Error (" Invalid parameters: " + err.toString)), headerMap)
51+ if (! checkAuth(request)) {
52+ new StringResponse (401 , " Unauthorized" , headerMap)
53+ } else {
54+ val bodyStr = request.getBodyString().trim.replaceAll(" \u0000 " , " " )
55+ val paramEither = Parameters .codec.decode(ByteBuffer .wrap(bodyStr.getBytes(" UTF-8" )))
56+ paramEither match {
57+ case Right (param) =>
58+ val id = captchaManager.getChallenge(param)
59+ getResponse(id, headerMap)
60+ case Left (err) =>
61+ getResponse(Left (Error (" Invalid parameters: " + err.toString)), headerMap)
62+ }
4263 }
4364 }
4465 )
4566 .GET (
4667 " /v2/media" ,
4768 (request) => {
48- val params = request.getQueryParams()
49- val result = if (params.containsKey(" id" )) {
50- val paramId = params.get(" id" ).get(0 )
51- val id = Id (paramId)
52- captchaManager.getCaptcha(id)
69+ if (! checkAuth(request)) {
70+ new StringResponse (401 , " Unauthorized" , headerMap)
5371 } else {
54- Left (Error (ErrorMessageEnum .INVALID_PARAM .toString + " => id" ))
72+ val params = request.getQueryParams()
73+ val result = if (params.containsKey(" id" )) {
74+ val paramId = params.get(" id" ).get(0 )
75+ val id = Id (paramId)
76+ captchaManager.getCaptcha(id)
77+ } else {
78+ Left (Error (ErrorMessageEnum .INVALID_PARAM .toString + " => id" ))
79+ }
80+ getResponse(result, headerMap)
5581 }
56- getResponse(result, headerMap)
5782 }
5883 )
5984 .POST (
6085 " /v2/answer" ,
6186 (request) => {
62- val bodyStr = request.getBodyString().trim.replaceAll(" \u0000 " , " " )
63- val answerEither = Answer .codec.decode(ByteBuffer .wrap(bodyStr.getBytes(" UTF-8" )))
64- answerEither match {
65- case Right (answer) =>
66- val result = captchaManager.checkAnswer(answer)
67- getResponse(result, headerMap)
68- case Left (err) =>
69- getResponse(Left (Error (" Invalid answer format: " + err.toString)), headerMap)
87+ if (! checkAuth(request)) {
88+ new StringResponse (401 , " Unauthorized" , headerMap)
89+ } else {
90+ val bodyStr = request.getBodyString().trim.replaceAll(" \u0000 " , " " )
91+ val answerEither = Answer .codec.decode(ByteBuffer .wrap(bodyStr.getBytes(" UTF-8" )))
92+ answerEither match {
93+ case Right (answer) =>
94+ val result = captchaManager.checkAnswer(answer)
95+ getResponse(result, headerMap)
96+ case Left (err) =>
97+ getResponse(Left (Error (" Invalid answer format: " + err.toString)), headerMap)
98+ }
7099 }
71100 }
72101 )
0 commit comments