Skip to content

Commit 649767d

Browse files
authored
Merge pull request #51374 from michalvavrik/feature/document-csrf-needs-security-ext
Document and validate Quarkus Security extension must be present for CSRF programmatic set up
2 parents 5e1f9b7 + d91d685 commit 649767d

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

docs/src/main/asciidoc/security-csrf-prevention.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ include::{generated-dir}/config/quarkus-rest-csrf.adoc[leveloffset=+1, opts=opti
329329
[[csrf-prevention-programmatic-set-up]]
330330
== Configuring the CSRF prevention programmatically
331331

332-
When the `quarkus-rest-csrf` extension is used, the `io.quarkus.vertx.http.security.HttpSecurity` CDI event allows you to customize the CSRF prevention programmatically:
332+
When the `quarkus-rest-csrf` extension is used together with the `quarkus-security` extension, the `io.quarkus.vertx.http.security.HttpSecurity` CDI event allows you to customize the CSRF prevention programmatically:
333333

334334
[source,java]
335335
----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.quarkus.csrf.reactive;
2+
3+
import static org.junit.jupiter.api.Assertions.assertThrows;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.quarkus.vertx.http.security.CSRF;
11+
12+
public class ProgrammaticCsrfValidationFailureTest {
13+
14+
@RegisterExtension
15+
static final QuarkusUnitTest config = new QuarkusUnitTest().withEmptyApplication();
16+
17+
@Test
18+
public void testQuarkusSecurityExtensionRequired() {
19+
var exception = assertThrows(IllegalStateException.class, CSRF::builder);
20+
assertTrue(exception.getMessage().contains("Please add the `quarkus-security` extension"));
21+
}
22+
23+
}

extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/HttpSecurityProcessor.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -303,21 +303,29 @@ void createHttpAuthenticationHandler(HttpSecurityRecorder recorder, Capabilities
303303
@BuildStep
304304
void prepareCsrfConfigBuilder(Capabilities capabilities, Optional<CsrfBuilderClassBuildItem> csrfBuilderClassBuildItem,
305305
BuildProducer<BytecodeTransformerBuildItem> bytecodeTransformerProducer) {
306-
if (capabilities.isPresent(Capability.SECURITY) && csrfBuilderClassBuildItem.isPresent()) {
306+
if (csrfBuilderClassBuildItem.isPresent()) {
307307
final Class<? extends CSRF.Builder> csrfBuilderClass = csrfBuilderClassBuildItem.get().csrfBuilderClass;
308-
// static Builder builder() {
309-
// return new io.quarkus.something.CsfrBuilder();
310-
// }
311-
bytecodeTransformerProducer.produce(new BytecodeTransformerBuildItem(CSRF.class.getName(), (cls, classVisitor) -> {
312-
var classTransformer = new ClassTransformer(cls);
313-
classTransformer.removeMethod("builder", CSRF.Builder.class);
314-
try (var mc = classTransformer.addMethod("builder", CSRF.Builder.class)) {
315-
mc.setModifiers(ACC_PUBLIC | ACC_STATIC);
316-
var builderInstance = mc.newInstance(MethodDescriptor.ofConstructor(csrfBuilderClass));
317-
mc.returnValue(mc.checkCast(builderInstance, CSRF.Builder.class));
318-
}
319-
return classTransformer.applyTo(classVisitor);
320-
}));
308+
bytecodeTransformerProducer
309+
.produce(new BytecodeTransformerBuildItem(CSRF.class.getName(), (cls, classVisitor) -> {
310+
var classTransformer = new ClassTransformer(cls);
311+
classTransformer.removeMethod("builder", CSRF.Builder.class);
312+
try (var mc = classTransformer.addMethod("builder", CSRF.Builder.class)) {
313+
mc.setModifiers(ACC_PUBLIC | ACC_STATIC);
314+
if (capabilities.isPresent(Capability.SECURITY)) {
315+
// static Builder builder() {
316+
// return new io.quarkus.something.CsfrBuilder();
317+
// }
318+
var builderInstance = mc.newInstance(MethodDescriptor.ofConstructor(csrfBuilderClass));
319+
mc.returnValue(mc.checkCast(builderInstance, CSRF.Builder.class));
320+
} else {
321+
// static Builder builder() {
322+
// throw new IllegalStateException("Please add the `quarkus-security` extension");
323+
// }
324+
mc.throwException(IllegalStateException.class, "Please add the `quarkus-security` extension");
325+
}
326+
}
327+
return classTransformer.applyTo(classVisitor);
328+
}));
321329
}
322330
}
323331

0 commit comments

Comments
 (0)