Skip to content

Commit 05f52c1

Browse files
committed
add type parameter ERROR_OUTPUT to anti csrf methods
1 parent 098fb4e commit 05f52c1

File tree

7 files changed

+96
-87
lines changed

7 files changed

+96
-87
lines changed

session/core/src/main/scala/com/softwaremill/session/CsrfEndpoints.scala

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import scala.concurrent.{ExecutionContext, Future}
99

1010
trait CsrfEndpoints {
1111

12-
def hmacTokenCsrfProtection[T, SECURITY_INPUT, PRINCIPAL, SECURITY_OUTPUT](
12+
def hmacTokenCsrfProtection[T, SECURITY_INPUT, PRINCIPAL, ERROR_OUTPUT, SECURITY_OUTPUT](
1313
checkMode: TapirCsrfCheckMode[T]
1414
)(
1515
body: => PartialServerEndpointWithSecurityOutput[
1616
SECURITY_INPUT,
1717
PRINCIPAL,
1818
Unit,
19-
Unit,
19+
ERROR_OUTPUT,
2020
SECURITY_OUTPUT,
2121
Unit,
2222
Any,
@@ -36,15 +36,22 @@ trait CsrfEndpoints {
3636
body
3737
}
3838

39-
def hmacTokenCsrfProtectionWithFormOrMultipart[T, SECURITY_INPUT, PRINCIPAL, SECURITY_OUTPUT, F](
39+
def hmacTokenCsrfProtectionWithFormOrMultipart[
40+
T,
41+
SECURITY_INPUT,
42+
PRINCIPAL,
43+
ERROR_OUTPUT,
44+
SECURITY_OUTPUT,
45+
F
46+
](
4047
checkMode: TapirCsrfCheckMode[T],
4148
form: Either[EndpointIO.Body[String, F], EndpointIO.Body[Seq[RawPart], F]]
4249
)(
4350
body: => PartialServerEndpointWithSecurityOutput[
4451
SECURITY_INPUT,
4552
PRINCIPAL,
4653
Unit,
47-
Unit,
54+
ERROR_OUTPUT,
4855
SECURITY_OUTPUT,
4956
Unit,
5057
Any,
@@ -64,14 +71,14 @@ trait CsrfEndpoints {
6471
body
6572
}
6673

67-
def setNewCsrfToken[T, SECURITY_INPUT, PRINCIPAL, SECURITY_OUTPUT](
74+
def setNewCsrfToken[T, SECURITY_INPUT, PRINCIPAL, ERROR_OUTPUT, SECURITY_OUTPUT](
6875
checkMode: TapirCsrfCheckMode[T]
6976
)(
7077
body: => PartialServerEndpointWithSecurityOutput[
7178
SECURITY_INPUT,
7279
PRINCIPAL,
7380
Unit,
74-
Unit,
81+
ERROR_OUTPUT,
7582
SECURITY_OUTPUT,
7683
Unit,
7784
Any,
@@ -81,7 +88,7 @@ trait CsrfEndpoints {
8188
SECURITY_INPUT,
8289
PRINCIPAL,
8390
Unit,
84-
Unit,
91+
ERROR_OUTPUT,
8592
(SECURITY_OUTPUT, Option[CookieValueWithMeta]),
8693
Unit,
8794
Any,

session/core/src/main/scala/com/softwaremill/session/OneOffTapirSession.scala

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,55 +32,52 @@ private[session] trait OneOffTapirSession[T] {
3232
header[Option[String]](manager.config.sessionHeaderConfig.sendToClientHeaderName)
3333
}
3434

35-
def setOneOffSession[SECURITY_INPUT, SECURITY_OUTPUT](st: SetSessionTransport)(
35+
def setOneOffSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](st: SetSessionTransport)(
3636
body: => PartialServerEndpointWithSecurityOutput[
3737
SECURITY_INPUT,
3838
Option[T],
3939
Unit,
40-
Unit,
40+
ERROR_OUTPUT,
4141
SECURITY_OUTPUT,
4242
Unit,
4343
Any,
4444
Future
4545
]
4646
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
4747
T
48-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
48+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
4949
st match {
5050
case CookieST => setOneOffCookieSession(body)
5151
case HeaderST => setOneOffHeaderSession(body)
5252
}
5353

54-
private[this] def setOneOffSessionLogic(
54+
private[this] def setOneOffSessionLogic[ERROR_OUTPUT](
5555
option: Option[T],
5656
existing: Option[String]
57-
): Either[Unit, Option[String]] =
57+
): Either[ERROR_OUTPUT, Option[String]] =
5858
existing match {
59-
case Some(value) =>
60-
Right(
61-
Some(value)
62-
)
63-
case _ =>
59+
case None =>
6460
option match {
6561
case Some(v) => Right(Some(manager.clientSessionManager.encode(v)))
66-
case _ => Left(())
62+
case _ => Right(None)
6763
}
64+
case some => Right(some)
6865
}
6966

70-
def setOneOffCookieSession[SECURITY_INPUT, SECURITY_OUTPUT](
67+
def setOneOffCookieSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](
7168
body: => PartialServerEndpointWithSecurityOutput[
7269
SECURITY_INPUT,
7370
Option[T],
7471
Unit,
75-
Unit,
72+
ERROR_OUTPUT,
7673
SECURITY_OUTPUT,
7774
Unit,
7875
Any,
7976
Future
8077
]
8178
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
8279
T
83-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
80+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
8481
body.endpoint
8582
.securityIn(getSessionFromClientAsCookie.map(Seq(_))(_.head))
8683
.out(body.securityOutput)
@@ -102,20 +99,20 @@ private[session] trait OneOffTapirSession[T] {
10299
}
103100
}
104101

105-
def setOneOffHeaderSession[SECURITY_INPUT, SECURITY_OUTPUT](
102+
def setOneOffHeaderSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](
106103
body: => PartialServerEndpointWithSecurityOutput[
107104
SECURITY_INPUT,
108105
Option[T],
109106
Unit,
110-
Unit,
107+
ERROR_OUTPUT,
111108
SECURITY_OUTPUT,
112109
Unit,
113110
Any,
114111
Future
115112
]
116113
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
117114
T
118-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
115+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
119116
body.endpoint
120117
.securityIn(getSessionFromClientAsHeader.map(Seq(_))(_.head))
121118
.out(body.securityOutput)
@@ -263,11 +260,11 @@ private[session] trait OneOffTapirSession[T] {
263260
)
264261
}
265262

266-
private[this] def invalidateOneOffSessionLogic[SECURITY_OUTPUT, PRINCIPAL](
263+
private[this] def invalidateOneOffSessionLogic[SECURITY_OUTPUT, PRINCIPAL, ERROR_OUTPUT](
267264
result: (SECURITY_OUTPUT, PRINCIPAL),
268265
maybeCookie: Option[String],
269266
maybeHeader: Option[String]
270-
): Either[Unit, (Seq[Option[String]], PRINCIPAL)] = {
267+
): Either[ERROR_OUTPUT, (Seq[Option[String]], PRINCIPAL)] = {
271268
val principal = result._2
272269
maybeCookie match {
273270
case Some(_) =>
@@ -303,13 +300,14 @@ private[session] trait OneOffTapirSession[T] {
303300

304301
def invalidateOneOffSession[
305302
SECURITY_INPUT,
306-
PRINCIPAL
303+
PRINCIPAL,
304+
ERROR_OUTPUT
307305
](st: GetSessionTransport)(
308306
body: => PartialServerEndpointWithSecurityOutput[
309307
SECURITY_INPUT,
310308
PRINCIPAL,
311309
Unit,
312-
Unit,
310+
ERROR_OUTPUT,
313311
_,
314312
Unit,
315313
Any,
@@ -319,7 +317,7 @@ private[session] trait OneOffTapirSession[T] {
319317
(SECURITY_INPUT, Seq[Option[String]]),
320318
PRINCIPAL,
321319
Unit,
322-
Unit,
320+
ERROR_OUTPUT,
323321
Seq[Option[String]],
324322
Unit,
325323
Any,

session/core/src/main/scala/com/softwaremill/session/RefreshableTapirSession.scala

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,20 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
3636
header[Option[String]](manager.config.refreshTokenHeaderConfig.sendToClientHeaderName)
3737
}
3838

39-
def setRefreshableSession[SECURITY_INPUT, SECURITY_OUTPUT](st: SetSessionTransport)(
39+
def setRefreshableSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](st: SetSessionTransport)(
4040
body: => PartialServerEndpointWithSecurityOutput[
4141
SECURITY_INPUT,
4242
Option[T],
4343
Unit,
44-
Unit,
44+
ERROR_OUTPUT,
4545
SECURITY_OUTPUT,
4646
Unit,
4747
Any,
4848
Future
4949
]
5050
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
5151
T
52-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
52+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
5353
st match {
5454
case CookieST => setRefreshableCookieSession(body)
5555
case HeaderST => setRefreshableHeaderSession(body)
@@ -67,29 +67,29 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
6767
}
6868
}
6969

70-
def setRefreshableSessionLogic(
70+
def setRefreshableSessionLogic[ERROR_OUTPUT](
7171
option: Option[T],
7272
existing: Option[String]
73-
): Either[Unit, Option[String]] =
73+
): Either[ERROR_OUTPUT, Option[String]] =
7474
option match {
7575
case Some(v) => Right(rotateToken(v, existing))
76-
case _ => Left(())
76+
case _ => Right(None)
7777
}
7878

79-
def setRefreshableCookieSession[SECURITY_INPUT, SECURITY_OUTPUT](
79+
def setRefreshableCookieSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](
8080
body: => PartialServerEndpointWithSecurityOutput[
8181
SECURITY_INPUT,
8282
Option[T],
8383
Unit,
84-
Unit,
84+
ERROR_OUTPUT,
8585
SECURITY_OUTPUT,
8686
Unit,
8787
Any,
8888
Future
8989
]
9090
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
9191
T
92-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] = {
92+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] = {
9393
val partial =
9494
setOneOffSession(CookieST) {
9595
body
@@ -125,20 +125,20 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
125125
}
126126
}
127127

128-
def setRefreshableHeaderSession[SECURITY_INPUT, SECURITY_OUTPUT](
128+
def setRefreshableHeaderSession[SECURITY_INPUT, ERROR_OUTPUT, SECURITY_OUTPUT](
129129
body: => PartialServerEndpointWithSecurityOutput[
130130
SECURITY_INPUT,
131131
Option[T],
132132
Unit,
133-
Unit,
133+
ERROR_OUTPUT,
134134
SECURITY_OUTPUT,
135135
Unit,
136136
Any,
137137
Future
138138
]
139139
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
140140
T
141-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] = {
141+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] = {
142142
val partial = setOneOffSession(HeaderST) {
143143
body
144144
}
@@ -415,12 +415,12 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
415415
}
416416
}
417417

418-
private[this] def invalidateRefreshableSessionLogic[PRINCIPAL](
418+
private[this] def invalidateRefreshableSessionLogic[PRINCIPAL, ERROR_OUTPUT](
419419
result: (Seq[Option[String]], PRINCIPAL),
420420
cookie: Option[String],
421421
header: Option[String]
422422
): Either[
423-
Nothing,
423+
ERROR_OUTPUT,
424424
(
425425
Seq[Option[String]],
426426
PRINCIPAL
@@ -449,13 +449,14 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
449449

450450
def invalidateRefreshableSession[
451451
SECURITY_INPUT,
452-
PRINCIPAL
452+
PRINCIPAL,
453+
ERROR_OUTPUT
453454
](st: GetSessionTransport)(
454455
body: => PartialServerEndpointWithSecurityOutput[
455456
SECURITY_INPUT,
456457
PRINCIPAL,
457458
Unit,
458-
Unit,
459+
ERROR_OUTPUT,
459460
_,
460461
Unit,
461462
Any,
@@ -465,7 +466,7 @@ private[session] trait RefreshableTapirSession[T] extends Completion {
465466
(SECURITY_INPUT, Seq[Option[String]]),
466467
PRINCIPAL,
467468
Unit,
468-
Unit,
469+
ERROR_OUTPUT,
469470
Seq[Option[String]],
470471
Unit,
471472
Any,

session/core/src/main/scala/com/softwaremill/session/SessionEndpoints.scala

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,32 @@ import scala.concurrent.{ExecutionContext, Future}
77

88
trait SessionEndpoints {
99

10-
def setSessionEndpoint[T, SECURITY_INPUT](
11-
endpoint: => Endpoint[SECURITY_INPUT, Unit, Unit, Unit, Any]
10+
def setSessionEndpoint[T, SECURITY_INPUT, ERROR_OUTPUT](
11+
endpoint: => Endpoint[SECURITY_INPUT, Unit, ERROR_OUTPUT, Unit, Any]
1212
)(implicit
1313
f: SECURITY_INPUT => Option[T]
1414
): PartialServerEndpointWithSecurityOutput[SECURITY_INPUT, Option[
1515
T
16-
], Unit, Unit, Unit, Unit, Any, Future] =
17-
endpoint.serverSecurityLogicSuccessWithOutput(si => Future.successful(((), f(si))))
16+
], Unit, ERROR_OUTPUT, Unit, Unit, Any, Future] =
17+
endpoint
18+
.serverSecurityLogicSuccessWithOutput(si => Future.successful(((), f(si))))
1819

1920
/** Set the session cookie with the session content. The content is signed, optionally encrypted
2021
* and with an optional expiry date.
2122
*
2223
* If refreshable, generates a new token (removing old ones) and stores it in the refresh token
2324
* cookie.
2425
*/
25-
def setSession[T, SECURITY_INPUT, SECURITY_OUTPUT](
26+
def setSession[T, SECURITY_INPUT, SECURITY_OUTPUT, ERROR_OUTPUT](
2627
sc: TapirSessionContinuity[T],
2728
st: SetSessionTransport
2829
)(
2930
body: => PartialServerEndpointWithSecurityOutput[SECURITY_INPUT, Option[
3031
T
31-
], Unit, Unit, SECURITY_OUTPUT, Unit, Any, Future]
32+
], Unit, ERROR_OUTPUT, SECURITY_OUTPUT, Unit, Any, Future]
3233
): PartialServerEndpointWithSecurityOutput[(SECURITY_INPUT, Seq[Option[String]]), Option[
3334
T
34-
], Unit, Unit, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
35+
], Unit, ERROR_OUTPUT, (SECURITY_OUTPUT, Seq[Option[String]]), Unit, Any, Future] =
3536
sc.setSession(st)(body)
3637

3738
def setSessionWithAuth[T, A](sc: TapirSessionContinuity[T], st: SetSessionTransport)(
@@ -53,7 +54,7 @@ trait SessionEndpoints {
5354
Any,
5455
Future
5556
] =
56-
setSession[T, A, Unit](sc, st) {
57+
setSession[T, A, Unit, Unit](sc, st) {
5758
setSessionEndpoint {
5859
endpoint.securityIn(auth)
5960
}
@@ -81,15 +82,15 @@ trait SessionEndpoints {
8182
* Note that you should use `refreshable` if you use refreshable systems even only for some
8283
* users.
8384
*/
84-
def invalidateSession[T, SECURITY_INPUT, PRINCIPAL](
85+
def invalidateSession[T, SECURITY_INPUT, PRINCIPAL, ERROR_OUTPUT](
8586
sc: TapirSessionContinuity[T],
8687
st: GetSessionTransport
8788
)(
8889
body: => PartialServerEndpointWithSecurityOutput[
8990
SECURITY_INPUT,
9091
PRINCIPAL,
9192
Unit,
92-
Unit,
93+
ERROR_OUTPUT,
9394
_,
9495
Unit,
9596
Any,
@@ -99,7 +100,7 @@ trait SessionEndpoints {
99100
(SECURITY_INPUT, Seq[Option[String]]),
100101
PRINCIPAL,
101102
Unit,
102-
Unit,
103+
ERROR_OUTPUT,
103104
Seq[Option[String]],
104105
Unit,
105106
Any,

0 commit comments

Comments
 (0)