Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Commit 7e3d0c6

Browse files
committed
pekko-http-session
package names Update SessionInvalidationScala.scala
1 parent 8ff8681 commit 7e3d0c6

File tree

65 files changed

+6713
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+6713
-0
lines changed

pekko-http-session/build.sbt

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import com.softwaremill.SbtSoftwareMillCommon.commonSmlBuildSettings
2+
import com.softwaremill.Publish.ossPublishSettings
3+
4+
val scala2_12 = "2.12.18"
5+
val scala2_13 = "2.13.11"
6+
val scala3 = "3.3.0"
7+
val scalaVersions = List(scala2_12, scala2_13, scala3)
8+
9+
lazy val commonSettings = commonSmlBuildSettings ++ ossPublishSettings ++ Seq(
10+
organization := "com.softwaremill.pekko-http-session",
11+
versionScheme := Some("early-semver")
12+
)
13+
14+
val pekkoHttpVersion = "1.0.0"
15+
val pekkoStreamsVersion = "1.0.1"
16+
val scalaJava8CompatVersion = "1.0.2"
17+
val json4sVersion = "4.0.4"
18+
val pekkoStreamsProvided = "org.apache.pekko" %% "pekko-stream" % pekkoStreamsVersion % "provided"
19+
val pekkoStreamsTestkit = "org.apache.pekko" %% "pekko-stream-testkit" % pekkoStreamsVersion % "test"
20+
21+
val scalaTest = "org.scalatest" %% "scalatest" % "3.2.16" % "test"
22+
23+
lazy val rootProject = (project in file("."))
24+
.settings(commonSettings: _*)
25+
.settings(publish / skip := true, name := "pekko-http-session", scalaVersion := scala2_13)
26+
.aggregate(core.projectRefs ++ jwt.projectRefs ++ example.projectRefs ++ javaTests.projectRefs: _*)
27+
28+
lazy val core = (projectMatrix in file("core"))
29+
.settings(commonSettings: _*)
30+
.settings(
31+
name := "core",
32+
libraryDependencies ++= Seq(
33+
"org.apache.pekko" %% "pekko-http" % pekkoHttpVersion,
34+
"org.scala-lang.modules" %% "scala-java8-compat" % scalaJava8CompatVersion,
35+
pekkoStreamsProvided,
36+
"org.apache.pekko" %% "pekko-http-testkit" % pekkoHttpVersion % "test",
37+
pekkoStreamsTestkit,
38+
"org.scalacheck" %% "scalacheck" % "1.15.4" % "test",
39+
scalaTest
40+
)
41+
)
42+
.jvmPlatform(scalaVersions = scalaVersions)
43+
44+
lazy val jwt = (projectMatrix in file("jwt"))
45+
.settings(commonSettings: _*)
46+
.settings(
47+
name := "jwt",
48+
libraryDependencies ++= Seq(
49+
"org.json4s" %% "json4s-jackson" % json4sVersion,
50+
"org.json4s" %% "json4s-ast" % json4sVersion,
51+
"org.json4s" %% "json4s-core" % json4sVersion,
52+
pekkoStreamsProvided,
53+
scalaTest
54+
),
55+
// generating docs for 2.13 causes an error: "not found: type DefaultFormats$"
56+
Compile / doc / sources := Seq.empty
57+
)
58+
.jvmPlatform(scalaVersions = scalaVersions)
59+
.dependsOn(core)
60+
61+
lazy val example = (projectMatrix in file("example"))
62+
.settings(commonSettings: _*)
63+
.settings(
64+
publishArtifact := false,
65+
libraryDependencies ++= Seq(
66+
pekkoStreamsProvided,
67+
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.4",
68+
"ch.qos.logback" % "logback-classic" % "1.2.12",
69+
"org.json4s" %% "json4s-ext" % json4sVersion
70+
)
71+
)
72+
.jvmPlatform(scalaVersions = scalaVersions)
73+
.dependsOn(core, jwt)
74+
75+
lazy val javaTests = (projectMatrix in file("javaTests"))
76+
.settings(commonSettings: _*)
77+
.settings(
78+
name := "javaTests",
79+
Test / testOptions := Seq(Tests.Argument(TestFrameworks.JUnit, "-a")), // required for javadsl JUnit tests
80+
crossPaths := false, // https://github.com/sbt/junit-interface/issues/35
81+
publishArtifact := false,
82+
libraryDependencies ++= Seq(
83+
pekkoStreamsProvided,
84+
"org.apache.pekko" %% "pekko-http" % pekkoHttpVersion,
85+
"org.scala-lang.modules" %% "scala-java8-compat" % scalaJava8CompatVersion,
86+
"org.apache.pekko" %% "pekko-http-testkit" % pekkoHttpVersion % "test",
87+
pekkoStreamsTestkit,
88+
"junit" % "junit" % "4.13.2" % "test",
89+
"com.github.sbt" % "junit-interface" % "0.13.3" % "test",
90+
scalaTest
91+
)
92+
)
93+
.jvmPlatform(scalaVersions = scalaVersions)
94+
.dependsOn(core, jwt)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.softwaremill.pekkohttpsession.javadsl
2+
3+
import com.softwaremill.pekkohttpsession
4+
import com.softwaremill.pekkohttpsession.CsrfCheckMode
5+
6+
import java.util.function.Supplier
7+
import org.apache.pekko.http.javadsl.server.Route
8+
import org.apache.pekko.http.javadsl.server.directives.RouteAdapter
9+
10+
/**
11+
* Java alternative for com.softwaremill.pekkohttpsession.CsrfDirectives
12+
*/
13+
trait CsrfDirectives {
14+
15+
def hmacTokenCsrfProtection[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
16+
pekkohttpsession.CsrfDirectives.hmacTokenCsrfProtection(checkMode) {
17+
inner.get.asInstanceOf[RouteAdapter].delegate
18+
}
19+
}
20+
21+
/**
22+
* @deprecated as of release 0.6.1, replaced by {@link #hmacTokensCsrfProtection()}
23+
*/
24+
def randomTokenCsrfProtection[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route =
25+
hmacTokenCsrfProtection(checkMode, inner)
26+
27+
def setNewCsrfToken[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
28+
pekkohttpsession.CsrfDirectives.setNewCsrfToken(checkMode) {
29+
inner.get.asInstanceOf[RouteAdapter].delegate
30+
}
31+
}
32+
33+
}
34+
35+
object CsrfDirectives extends CsrfDirectives
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.softwaremill.pekkohttpsession.javadsl;
2+
3+
import org.apache.pekko.http.javadsl.server.AllDirectives;
4+
import org.apache.pekko.http.javadsl.server.Route;
5+
import com.softwaremill.pekkohttpsession.CsrfCheckMode;
6+
import com.softwaremill.pekkohttpsession.GetSessionTransport;
7+
import com.softwaremill.pekkohttpsession.SessionContinuity;
8+
import com.softwaremill.pekkohttpsession.SessionManager;
9+
import com.softwaremill.pekkohttpsession.SessionResult;
10+
import com.softwaremill.pekkohttpsession.SetSessionTransport;
11+
12+
import java.util.Optional;
13+
import java.util.function.Function;
14+
import java.util.function.Supplier;
15+
16+
public class HttpSessionAwareDirectives<T> extends AllDirectives {
17+
18+
private final SessionManager<T> sessionManager;
19+
20+
public HttpSessionAwareDirectives(SessionManager<T> sessionManager) {
21+
this.sessionManager = sessionManager;
22+
}
23+
24+
public Route session(SessionContinuity sc, GetSessionTransport st, Function<SessionResult<T>, Route> continuity) {
25+
return SessionDirectives$.MODULE$.session(sc, st, continuity);
26+
}
27+
28+
public Route setSession(SessionContinuity sc, SetSessionTransport st, T session, Supplier<Route> continuity) {
29+
return SessionDirectives$.MODULE$.setSession(sc, st, session, continuity);
30+
}
31+
32+
public Route optionalSession(SessionContinuity sc, SetSessionTransport st, Function<Optional<T>, Route> continuity) {
33+
return SessionDirectives$.MODULE$.optionalSession(sc, st, continuity);
34+
}
35+
36+
public Route requiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
37+
return SessionDirectives$.MODULE$.requiredSession(sc, st, continuity);
38+
}
39+
40+
public Route touchRequiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
41+
return SessionDirectives$.MODULE$.touchRequiredSession(sc, st, continuity);
42+
}
43+
44+
public Route invalidateSession(SessionContinuity<T> sc, SetSessionTransport st, Supplier<Route> continuity) {
45+
return SessionDirectives$.MODULE$.invalidateSession(sc, st, continuity);
46+
}
47+
48+
public Route setNewCsrfToken(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
49+
return CsrfDirectives$.MODULE$.setNewCsrfToken(checkHeader, continuity);
50+
}
51+
52+
public Route randomTokenCsrfProtection(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
53+
return CsrfDirectives$.MODULE$.randomTokenCsrfProtection(checkHeader, continuity);
54+
}
55+
56+
public SessionManager<T> getSessionManager() {
57+
return sessionManager;
58+
}
59+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.softwaremill.pekkohttpsession.javadsl
2+
3+
/**
4+
* Can't use the trait com.softwaremill.pekkohttpsession.InMemoryRefreshTokenStorage in Java code, hence this wrapper
5+
* http://stackoverflow.com/questions/7637752/using-scala-traits-with-implemented-methods-in-java
6+
*/
7+
abstract class InMemoryRefreshTokenStorage[T]() extends com.softwaremill.pekkohttpsession.InMemoryRefreshTokenStorage[T]
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.softwaremill.pekkohttpsession.javadsl
2+
3+
import com.softwaremill.pekkohttpsession
4+
import com.softwaremill.pekkohttpsession.{GetSessionTransport, OneOffSessionDirectives, RefreshableSessionDirectives, SessionContinuity, SessionResult, SetSessionTransport}
5+
6+
import java.util.Optional
7+
import java.util.function.Supplier
8+
import org.apache.pekko.http.javadsl.server.Route
9+
import org.apache.pekko.http.javadsl.server.directives.RouteAdapter
10+
11+
import scala.compat.java8.OptionConverters._
12+
13+
/**
14+
* Java alternative for com.softwaremill.pekkohttpsession.SessionDirectives
15+
*/
16+
trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionDirectives {
17+
18+
def session[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[SessionResult[T], Route]): Route = RouteAdapter {
19+
pekkohttpsession.SessionDirectives.session(sc, st) { sessionResult =>
20+
inner.apply(sessionResult).asInstanceOf[RouteAdapter].delegate
21+
}
22+
}
23+
24+
def setSession[T](sc: SessionContinuity[T], st: SetSessionTransport, v: T, inner: Supplier[Route]): Route = RouteAdapter {
25+
pekkohttpsession.SessionDirectives.setSession(sc, st, v) {
26+
inner.get.asInstanceOf[RouteAdapter].delegate
27+
}
28+
}
29+
30+
def invalidateSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: Supplier[Route]): Route = RouteAdapter {
31+
pekkohttpsession.SessionDirectives.invalidateSession(sc, st) {
32+
inner.get.asInstanceOf[RouteAdapter].delegate
33+
}
34+
}
35+
36+
def optionalSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[Optional[T], Route]): Route = RouteAdapter {
37+
pekkohttpsession.SessionDirectives.optionalSession(sc, st) { session =>
38+
inner.apply(session.asJava).asInstanceOf[RouteAdapter].delegate
39+
}
40+
}
41+
42+
def requiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
43+
pekkohttpsession.SessionDirectives.requiredSession(sc, st) { session =>
44+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
45+
}
46+
}
47+
48+
def touchRequiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
49+
pekkohttpsession.SessionDirectives.touchRequiredSession(sc, st) { session =>
50+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
51+
}
52+
}
53+
54+
}
55+
56+
object SessionDirectives extends SessionDirectives
57+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.softwaremill.pekkohttpsession.javadsl;
2+
3+
import com.softwaremill.pekkohttpsession.MultiValueSessionSerializer;
4+
import com.softwaremill.pekkohttpsession.SessionSerializer;
5+
import com.softwaremill.pekkohttpsession.SessionSerializer$;
6+
import com.softwaremill.pekkohttpsession.converters.MapConverters;
7+
import scala.collection.JavaConverters;
8+
import scala.compat.java8.JFunction0;
9+
import scala.compat.java8.JFunction1;
10+
import scala.util.Try;
11+
12+
import java.util.Map;
13+
14+
/**
15+
* Wrapper for session serializers in com.softwaremill.pekkohttpsession.SessionSerializer
16+
*/
17+
public final class SessionSerializers {
18+
19+
public static final SessionSerializer<String, String> StringToStringSessionSerializer = SessionSerializer$.MODULE$.stringToStringSessionSerializer();
20+
public static final SessionSerializer<Integer, String> IntToStringSessionSerializer = (SessionSerializer<Integer, String>) (SessionSerializer) SessionSerializer$.MODULE$.intToStringSessionSerializer();
21+
public static final SessionSerializer<Long, String> LongToStringSessionSerializer = (SessionSerializer<Long, String>) (SessionSerializer) SessionSerializer$.MODULE$.longToStringSessionSerializer();
22+
public static final SessionSerializer<Float, String> FloatToStringSessionSerializer = (SessionSerializer<Float, String>) (SessionSerializer) SessionSerializer$.MODULE$.floatToStringSessionSerializer();
23+
public static final SessionSerializer<Double, String> DoubleToStringSessionSerializer = (SessionSerializer<Double, String>) (SessionSerializer) SessionSerializer$.MODULE$.doubleToStringSessionSerializer();
24+
25+
public static final SessionSerializer<Map<String, String>, String> MapToStringSessionSerializer = new MultiValueSessionSerializer<>(
26+
(JFunction1<Map<String, String>, scala.collection.immutable.Map<String, String>>) m -> MapConverters.toImmutableMap(m),
27+
(JFunction1<scala.collection.immutable.Map<String, String>, Try<Map<String, String>>>) v1 ->
28+
Try.apply((JFunction0<Map<String, String>>) () -> JavaConverters.mapAsJavaMapConverter(v1).asJava())
29+
);
30+
31+
private SessionSerializers() {
32+
}
33+
34+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.softwaremill.pekkohttpsession.javadsl;
2+
3+
import com.softwaremill.pekkohttpsession.CookieST$;
4+
import com.softwaremill.pekkohttpsession.HeaderST$;
5+
import com.softwaremill.pekkohttpsession.SetSessionTransport;
6+
7+
/**
8+
* Wrapper for session transports in com.softwaremill.pekkohttpsession.SetSessionTransport
9+
*/
10+
public final class SessionTransports {
11+
12+
public static final SetSessionTransport CookieST = CookieST$.MODULE$;
13+
public static final SetSessionTransport HeaderST = HeaderST$.MODULE$;
14+
15+
private SessionTransports() {
16+
}
17+
18+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
pekko.http.session {
2+
cookie {
3+
name = "_sessiondata"
4+
domain = none
5+
path = /
6+
secure = false
7+
http-only = true
8+
same-site = Lax
9+
}
10+
header {
11+
send-to-client-name = "Set-Authorization"
12+
get-from-client-name = "Authorization"
13+
}
14+
max-age = 7 days
15+
encrypt-data = false
16+
17+
jws {
18+
alg = "HS256"
19+
}
20+
21+
jwt {}
22+
23+
csrf {
24+
cookie {
25+
name = "XSRF-TOKEN"
26+
domain = none
27+
path = /
28+
secure = false
29+
http-only = false
30+
same-site = Lax
31+
}
32+
submitted-name = "X-XSRF-TOKEN"
33+
}
34+
35+
refresh-token {
36+
cookie {
37+
name = "_refreshtoken"
38+
domain = none
39+
path = /
40+
secure = false
41+
http-only = true
42+
same-site = Lax
43+
}
44+
header {
45+
send-to-client-name = "Set-Refresh-Token"
46+
get-from-client-name = "Refresh-Token"
47+
}
48+
max-age = 30 days
49+
remove-used-token-after = 5 seconds
50+
}
51+
52+
token-migration {
53+
v0-5-2 {
54+
enabled = false
55+
}
56+
v0-5-3 {
57+
enabled = false
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)