Skip to content

Commit 081f40e

Browse files
authored
pac4j: upgrade to 6.x (#3565)
- fix #3561
1 parent 9a1e7ed commit 081f40e

14 files changed

Lines changed: 257 additions & 150 deletions

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/CallbackFilterImpl.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
*/
66
package io.jooby.internal.pac4j;
77

8+
import org.pac4j.core.adapter.FrameworkAdapter;
89
import org.pac4j.core.config.Config;
910

1011
import edu.umd.cs.findbugs.annotations.NonNull;
1112
import io.jooby.Context;
1213
import io.jooby.Route;
13-
import io.jooby.pac4j.Pac4jContext;
14+
import io.jooby.pac4j.Pac4jFrameworkParameters;
1415
import io.jooby.pac4j.Pac4jOptions;
1516

1617
public class CallbackFilterImpl implements Route.Handler {
@@ -26,19 +27,16 @@ public CallbackFilterImpl(Config config, Pac4jOptions options) {
2627

2728
@NonNull @Override
2829
public Object apply(@NonNull Context ctx) throws Exception {
29-
Pac4jContext pac4j = Pac4jContext.create(ctx);
30-
31-
Object result =
30+
FrameworkAdapter.INSTANCE.applyDefaultSettingsIfUndefined(config);
31+
var result =
3232
config
3333
.getCallbackLogic()
3434
.perform(
35-
pac4j,
36-
pac4j.getSessionStore(),
3735
config,
38-
config.getHttpActionAdapter(),
3936
options.getDefaultUrl(),
40-
options.getSaveInSession(),
41-
options.getDefaultClient());
37+
options.getRenewSession(),
38+
options.getDefaultClient(),
39+
Pac4jFrameworkParameters.create(ctx));
4240

4341
return result == null ? ctx : result;
4442
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package io.jooby.internal.pac4j;
7+
8+
import org.pac4j.core.context.FrameworkParameters;
9+
import org.pac4j.core.context.WebContext;
10+
import org.pac4j.core.context.WebContextFactory;
11+
12+
import io.jooby.pac4j.Pac4jContext;
13+
import io.jooby.pac4j.Pac4jFrameworkParameters;
14+
15+
public class ContextFactoryImpl implements WebContextFactory {
16+
@Override
17+
public WebContext newContext(FrameworkParameters parameters) {
18+
if (parameters instanceof Pac4jFrameworkParameters params) {
19+
return Pac4jContext.create(params.getContext());
20+
}
21+
throw new IllegalArgumentException("Can't create context from: " + parameters);
22+
}
23+
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/GrantAccessAdapterImpl.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,60 @@
66
package io.jooby.internal.pac4j;
77

88
import java.util.Collection;
9-
import java.util.Iterator;
109

1110
import org.pac4j.core.context.WebContext;
1211
import org.pac4j.core.context.session.SessionStore;
1312
import org.pac4j.core.engine.SecurityGrantedAccessAdapter;
13+
import org.pac4j.core.exception.http.WithLocationAction;
1414
import org.pac4j.core.profile.UserProfile;
15+
import org.pac4j.core.util.Pac4jConstants;
1516

1617
import io.jooby.Context;
1718
import io.jooby.Route;
18-
import io.jooby.pac4j.Pac4jContext;
19+
import io.jooby.SneakyThrows;
20+
import io.jooby.pac4j.Pac4jOptions;
1921

2022
public class GrantAccessAdapterImpl implements SecurityGrantedAccessAdapter {
2123
private final Context ctx;
22-
private final Route.Handler next;
24+
private final Pac4jOptions config;
25+
private final SneakyThrows.Function2<WebContext, SessionStore, Object> next;
2326

24-
public GrantAccessAdapterImpl(Context ctx, Route.Handler next) {
27+
public GrantAccessAdapterImpl(Context ctx, Pac4jOptions config) {
28+
this(
29+
ctx,
30+
config,
31+
(context, sessionStore) -> {
32+
var requestedUrl =
33+
sessionStore
34+
.get(context, Pac4jConstants.REQUESTED_URL)
35+
.filter(WithLocationAction.class::isInstance)
36+
.map(it -> ((WithLocationAction) it).getLocation())
37+
.orElse(config.getDefaultUrl());
38+
return ctx.sendRedirect(requestedUrl);
39+
});
40+
}
41+
42+
public GrantAccessAdapterImpl(Context ctx, Pac4jOptions config, Route.Handler next) {
43+
this(ctx, config, (context, sessionStore) -> next.apply(ctx));
44+
}
45+
46+
private GrantAccessAdapterImpl(
47+
Context ctx,
48+
Pac4jOptions config,
49+
SneakyThrows.Function2<WebContext, SessionStore, Object> next) {
2550
this.ctx = ctx;
51+
this.config = config;
2652
this.next = next;
2753
}
2854

2955
@Override
3056
public Object adapt(
31-
WebContext webContext,
32-
SessionStore sessionStore,
33-
Collection<UserProfile> profiles,
34-
Object... objects)
57+
WebContext context, SessionStore sessionStore, Collection<UserProfile> profiles)
3558
throws Exception {
36-
Iterator<UserProfile> iterator = profiles.iterator();
59+
var iterator = profiles.iterator();
3760
if (iterator.hasNext()) {
38-
((Pac4jContext) webContext).getContext().setUser(iterator.next());
61+
ctx.setUser(iterator.next());
3962
}
40-
return next.apply(ctx);
41-
}
42-
43-
public static GrantAccessAdapterImpl redirect(Context context, String redirectTo) {
44-
return new GrantAccessAdapterImpl(context, ctx -> ctx.sendRedirect(redirectTo));
63+
return next.apply(context, sessionStore);
4564
}
4665
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/LogoutImpl.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
*/
66
package io.jooby.internal.pac4j;
77

8+
import org.pac4j.core.adapter.FrameworkAdapter;
89
import org.pac4j.core.config.Config;
910

1011
import edu.umd.cs.findbugs.annotations.NonNull;
1112
import io.jooby.Context;
1213
import io.jooby.Route;
13-
import io.jooby.pac4j.Pac4jContext;
14+
import io.jooby.pac4j.Pac4jFrameworkParameters;
1415
import io.jooby.pac4j.Pac4jOptions;
1516

1617
public class LogoutImpl implements Route.Handler {
@@ -26,23 +27,21 @@ public LogoutImpl(Config config, Pac4jOptions options) {
2627

2728
@NonNull @Override
2829
public Object apply(@NonNull Context ctx) throws Exception {
29-
String redirectTo = (String) ctx.getAttributes().get("pac4j.logout.redirectTo");
30-
if (redirectTo == null || redirectTo.length() == 0) {
30+
FrameworkAdapter.INSTANCE.applyDefaultSettingsIfUndefined(config);
31+
var redirectTo = (String) ctx.getAttributes().get("pac4j.logout.redirectTo");
32+
if (redirectTo == null || redirectTo.isEmpty()) {
3133
redirectTo = options.getDefaultUrl();
3234
}
3335
redirectTo = ctx.getRequestURL(redirectTo);
34-
Pac4jContext pac4jContext = Pac4jContext.create(ctx);
3536
return config
3637
.getLogoutLogic()
3738
.perform(
38-
pac4jContext,
39-
pac4jContext.getSessionStore(),
4039
config,
41-
config.getHttpActionAdapter(),
4240
redirectTo,
43-
null,
41+
options.getLogoutUrlPattern(),
4442
options.isLocalLogout(),
4543
options.isDestroySession(),
46-
options.isCentralLogout());
44+
options.isCentralLogout(),
45+
Pac4jFrameworkParameters.create(ctx));
4746
}
4847
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/Pac4jCurrentUser.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,24 @@
88
import java.util.function.Function;
99

1010
import org.pac4j.core.config.Config;
11-
import org.pac4j.core.profile.ProfileManager;
1211

1312
import io.jooby.Context;
1413
import io.jooby.pac4j.Pac4jContext;
1514

1615
public class Pac4jCurrentUser implements Function<Context, Object> {
1716

17+
private final Config config;
18+
19+
public Pac4jCurrentUser(Config config) {
20+
this.config = config;
21+
}
22+
1823
@Override
1924
public Object apply(Context ctx) {
20-
Pac4jContext pac4jContext = Pac4jContext.create(ctx);
21-
ProfileManager pm = new ProfileManager(pac4jContext, pac4jContext.getSessionStore());
22-
pm.setConfig(ctx.require(Config.class));
23-
return pm.getProfile().orElse(null);
25+
var pmf = config.getProfileManagerFactory();
26+
var pac4jContext = Pac4jContext.create(ctx);
27+
var pm = pmf.apply(pac4jContext, pac4jContext.getSessionStore());
28+
var profile = pm.getProfile().orElse(null);
29+
return profile;
2430
}
2531
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/SavedRequestHandlerImpl.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,24 @@
77

88
import java.util.Set;
99

10-
import org.pac4j.core.context.WebContext;
11-
import org.pac4j.core.context.session.SessionStore;
10+
import org.pac4j.core.context.CallContext;
1211
import org.pac4j.core.engine.savedrequest.DefaultSavedRequestHandler;
1312

14-
import io.jooby.Context;
1513
import io.jooby.pac4j.Pac4jContext;
1614

1715
public class SavedRequestHandlerImpl extends DefaultSavedRequestHandler {
18-
private Set<String> excludes;
16+
private final Set<String> excludes;
1917

2018
public SavedRequestHandlerImpl(Set<String> excludes) {
2119
this.excludes = excludes;
2220
}
2321

2422
@Override
25-
public void save(WebContext webContext, SessionStore sessionStore) {
26-
Pac4jContext pac4j = (Pac4jContext) webContext;
27-
Context context = pac4j.getContext();
23+
public void save(CallContext ctx) {
24+
var pac4j = (Pac4jContext) ctx.webContext();
25+
var context = pac4j.getContext();
2826
if (!excludes.contains(context.getRequestPath())) {
29-
super.save(webContext, sessionStore);
27+
super.save(ctx);
3028
}
3129
}
3230
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/SecurityFilterImpl.java

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,29 @@
1010
import java.util.List;
1111
import java.util.function.Supplier;
1212

13+
import org.pac4j.core.adapter.FrameworkAdapter;
1314
import org.pac4j.core.client.finder.ClientFinder;
1415
import org.pac4j.core.client.finder.DefaultSecurityClientFinder;
1516
import org.pac4j.core.config.Config;
1617
import org.pac4j.core.engine.DefaultSecurityLogic;
1718
import org.pac4j.core.engine.SecurityLogic;
18-
import org.pac4j.core.exception.http.WithLocationAction;
1919
import org.pac4j.core.util.Pac4jConstants;
2020

2121
import edu.umd.cs.findbugs.annotations.NonNull;
2222
import io.jooby.Context;
2323
import io.jooby.Route;
24-
import io.jooby.pac4j.Pac4jContext;
24+
import io.jooby.pac4j.Pac4jFrameworkParameters;
2525
import io.jooby.pac4j.Pac4jOptions;
2626

2727
public class SecurityFilterImpl implements Route.Filter, Route.Handler {
2828

29-
private String pattern;
29+
private final String pattern;
3030

31-
private Config config;
31+
private final Config config;
3232

33-
private Pac4jOptions options;
33+
private final Pac4jOptions options;
3434

35-
private Supplier<String> clients;
35+
private final Supplier<String> clients;
3636

3737
private String authorizers;
3838

@@ -61,10 +61,10 @@ public void addAuthorizer(String authorizer) {
6161
public Route.Handler apply(@NonNull Route.Handler next) {
6262
return ctx -> {
6363
if (pattern == null) {
64-
return perform(Pac4jContext.create(ctx), new GrantAccessAdapterImpl(ctx, next));
64+
return perform(ctx, new GrantAccessAdapterImpl(ctx, options, next));
6565
} else {
6666
if (ctx.matches(pattern)) {
67-
return perform(Pac4jContext.create(ctx), new GrantAccessAdapterImpl(ctx, next));
67+
return perform(ctx, new GrantAccessAdapterImpl(ctx, options, next));
6868
} else {
6969
return next.apply(ctx);
7070
}
@@ -74,32 +74,16 @@ public Route.Handler apply(@NonNull Route.Handler next) {
7474

7575
@NonNull @Override
7676
public Object apply(@NonNull Context ctx) throws Exception {
77-
Pac4jContext pac4j = Pac4jContext.create(ctx);
78-
String requestedUrl =
79-
(String)
80-
pac4j
81-
.getSessionStore()
82-
.get(pac4j, Pac4jConstants.REQUESTED_URL)
83-
.filter(WithLocationAction.class::isInstance)
84-
.map(it -> ((WithLocationAction) it).getLocation())
85-
.orElse(options.getDefaultUrl());
86-
return perform(pac4j, GrantAccessAdapterImpl.redirect(ctx, requestedUrl));
77+
return perform(ctx, new GrantAccessAdapterImpl(ctx, options));
8778
}
8879

89-
private Object perform(Pac4jContext ctx, GrantAccessAdapterImpl grantAccessAdapter) {
90-
SecurityLogic securityLogic = config.getSecurityLogic();
91-
String clients = ctx.getContext().query(clientName(securityLogic)).value(this.clients.get());
92-
String authorizers = ofNullable(this.authorizers).orElse(NoopAuthorizer.NAME);
80+
private Object perform(Context ctx, GrantAccessAdapterImpl accessAdapter) throws Exception {
81+
FrameworkAdapter.INSTANCE.applyDefaultSettingsIfUndefined(config);
82+
var securityLogic = config.getSecurityLogic();
83+
var clients = ctx.lookup(clientName(securityLogic)).value(this.clients.get());
84+
var authorizers = ofNullable(this.authorizers).orElse(NoopAuthorizer.NAME);
9385
return securityLogic.perform(
94-
ctx,
95-
ctx.getSessionStore(),
96-
config,
97-
grantAccessAdapter,
98-
config.getHttpActionAdapter(),
99-
clients,
100-
authorizers,
101-
null,
102-
options.getMultiProfile());
86+
config, accessAdapter, clients, authorizers, null, Pac4jFrameworkParameters.create(ctx));
10387
}
10488

10589
private String clientName(SecurityLogic securityLogic) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package io.jooby.internal.pac4j;
7+
8+
import org.pac4j.core.context.FrameworkParameters;
9+
import org.pac4j.core.context.session.SessionStore;
10+
import org.pac4j.core.context.session.SessionStoreFactory;
11+
12+
import io.jooby.pac4j.Pac4jContext;
13+
14+
public class SessionStoreFactoryImpl implements SessionStoreFactory {
15+
@Override
16+
public SessionStore newSessionStore(FrameworkParameters parameters) {
17+
if (parameters instanceof Pac4jContext ctx) {
18+
return ctx.getSessionStore();
19+
}
20+
return new SessionStoreImpl();
21+
}
22+
}

modules/jooby-pac4j/src/main/java/io/jooby/internal/pac4j/WebContextImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public WebContextImpl(Context context) {
3535
}
3636

3737
@Override
38-
public Context getContext() {
38+
public @NonNull Context getContext() {
3939
return context;
4040
}
4141

0 commit comments

Comments
 (0)