Skip to content

Commit 1eb676a

Browse files
committed
pac4j: url resolver: generates wrong urls when url is absolute fix #3637
1 parent ab9cc7d commit 1eb676a

File tree

4 files changed

+55
-14
lines changed

4 files changed

+55
-14
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package io.jooby.internal.pac4j;
77

8+
import static java.util.Collections.emptyMap;
89
import static java.util.Optional.ofNullable;
910

1011
import java.util.List;
@@ -14,6 +15,7 @@
1415
import org.pac4j.core.client.finder.DefaultSecurityClientFinder;
1516
import org.pac4j.core.engine.DefaultSecurityLogic;
1617
import org.pac4j.core.engine.SecurityLogic;
18+
import org.pac4j.core.matching.matcher.DefaultMatchers;
1719
import org.pac4j.core.util.Pac4jConstants;
1820

1921
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -74,8 +76,19 @@ private Object perform(Context ctx, GrantAccessAdapterImpl accessAdapter) {
7476
var securityLogic = config.getSecurityLogic();
7577
var clients = ctx.lookup(clientName(securityLogic)).value(this.clients.get());
7678
var authorizers = ofNullable(this.authorizers).orElse(NoopAuthorizer.NAME);
79+
var matcherSet = ofNullable(config.getMatchers()).orElse(emptyMap()).keySet();
80+
var matchers =
81+
matcherSet.isEmpty()
82+
? DefaultMatchers.NONE
83+
: String.join(Pac4jConstants.ELEMENT_SEPARATOR, matcherSet);
84+
7785
return securityLogic.perform(
78-
config, accessAdapter, clients, authorizers, null, Pac4jFrameworkParameters.create(ctx));
86+
config,
87+
accessAdapter,
88+
clients,
89+
authorizers,
90+
matchers,
91+
Pac4jFrameworkParameters.create(ctx));
7992
} catch (RuntimeException re) {
8093
if (re.getCause() != null) {
8194
throw SneakyThrows.propagate(re.getCause());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void set(WebContext context, String key, Object value) {
7878
if (value == null || value.toString().isEmpty()) {
7979
getSessionOrEmpty(context).ifPresent(session -> session.remove(key));
8080
} else {
81-
String encoded = objToStr(context(context).require(Serializer.class), value);
81+
var encoded = objToStr(context(context).require(Serializer.class), value);
8282
getSession(context).put(key, encoded);
8383
}
8484
}

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

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

8-
import static java.util.regex.Pattern.CASE_INSENSITIVE;
9-
import static java.util.regex.Pattern.compile;
10-
11-
import java.util.regex.Pattern;
8+
import java.net.URI;
129

1310
import org.pac4j.core.context.WebContext;
1411
import org.pac4j.core.http.url.UrlResolver;
@@ -19,27 +16,35 @@
1916

2017
public class UrlResolverImpl implements UrlResolver {
2118

22-
private static final Pattern HTTP_URL = compile("^https?:.*", CASE_INSENSITIVE);
23-
2419
private final Logger log = LoggerFactory.getLogger(getClass());
2520

2621
@Override
27-
public String compute(String path, WebContext context) {
22+
public String compute(String url, WebContext context) {
23+
var absoluteURL = isAbsoluteURL(url);
2824
if (context == null) {
29-
if (!HTTP_URL.matcher(path).matches()) {
25+
if (!absoluteURL) {
3026
log.warn(
3127
"Unable to resolve URL from path '{}' since no web context was provided. This may"
3228
+ " prevent some authentication clients to work properly. Consider explicitly"
3329
+ " specifying an absolute callback URL or using a custom url resolver.",
34-
path);
30+
url);
3531
}
3632

37-
return path;
33+
return url;
3834
}
39-
40-
String requestURL = ((Pac4jContext) context).getContext().getRequestURL(path);
35+
// Rewrite using context which might uses trust proxy setting.
36+
var path = absoluteURL ? URI.create(url).getPath() : url;
37+
var requestURL = ((Pac4jContext) context).getContext().getRequestURL(path);
4138
// no query String
4239
int i = requestURL.indexOf('?');
4340
return i > 0 ? requestURL.substring(0, i) : requestURL;
4441
}
42+
43+
private static boolean isAbsoluteURL(String url) {
44+
try {
45+
return URI.create(url).isAbsolute();
46+
} catch (Exception ignored) {
47+
return false;
48+
}
49+
}
4550
}

modules/jooby-pac4j/src/main/java/io/jooby/pac4j/Pac4jOptions.java

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

8+
import java.util.List;
89
import java.util.Optional;
910

11+
import org.pac4j.core.client.Client;
12+
import org.pac4j.core.client.Clients;
1013
import org.pac4j.core.config.Config;
1114
import org.pac4j.core.util.serializer.JavaSerializer;
1215
import org.pac4j.core.util.serializer.Serializer;
@@ -72,6 +75,26 @@ private Pac4jOptions(Config config) {
7275

7376
public Pac4jOptions() {}
7477

78+
public Pac4jOptions(Clients clients) {
79+
super(clients);
80+
}
81+
82+
public Pac4jOptions(Client client) {
83+
super(client);
84+
}
85+
86+
public Pac4jOptions(List<Client> client) {
87+
super(client);
88+
}
89+
90+
public Pac4jOptions(String callbackPath, Client client) {
91+
super(callbackPath, client);
92+
}
93+
94+
public Pac4jOptions(String callbackPath, List<Client> clients) {
95+
super(callbackPath, clients);
96+
}
97+
7598
/**
7699
* Get a Pac4j options instance of {@link Config}.
77100
*

0 commit comments

Comments
 (0)