Skip to content

Commit d02182c

Browse files
committed
Sync documentation of main branch
1 parent e033da3 commit d02182c

14 files changed

+141
-79
lines changed

_generated-doc/main/config/quarkus-all-config.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21448,12 +21448,16 @@ endif::add-copy-button-to-config-props[]
2144821448

2144921449
[.description]
2145021450
--
21451-
Specify the dependencies that are allowed to have proto files that can be imported by this application's protos Applicable values:
21451+
Specify the dependencies that are allowed to have proto files that can be imported by this application's protos
21452+
21453+
Applicable values:
2145221454

2145321455
- _none_ - default - don't scan dependencies
2145421456
- a comma separated list of _groupId:artifactId_ coordinates to scan
2145521457
- _all_ - scan all dependencies
2145621458

21459+
21460+
2145721461
By default, _com.google.protobuf:protobuf-java_.
2145821462

2145921463

_generated-doc/main/config/quarkus-grpc_quarkus.generate-code.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,16 @@ endif::add-copy-button-to-config-props[]
4040

4141
[.description]
4242
--
43-
Specify the dependencies that are allowed to have proto files that can be imported by this application's protos Applicable values:
43+
Specify the dependencies that are allowed to have proto files that can be imported by this application's protos
44+
45+
Applicable values:
4446

4547
- _none_ - default - don't scan dependencies
4648
- a comma separated list of _groupId:artifactId_ coordinates to scan
4749
- _all_ - scan all dependencies
4850

51+
52+
4953
By default, _com.google.protobuf:protobuf-java_.
5054

5155

_generated-doc/main/infra/quarkus-all-build-items.adoc

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5843,30 +5843,38 @@ h|Attributes
58435843

58445844

58455845

5846-
a| https://github.com/quarkusio/quarkus/blob/main/extensions/oidc-client/deployment/src/main/java/io/quarkus/oidc/client/deployment/AccessTokenInstanceBuildItem.java[`io.quarkus.oidc.client.deployment.AccessTokenInstanceBuildItem`, window="_blank"]
5846+
a| https://github.com/quarkusio/quarkus/blob/main/extensions/oidc-client/deployment/src/main/java/io/quarkus/oidc/client/deployment/OidcClientNamesBuildItem.java[`io.quarkus.oidc.client.deployment.OidcClientNamesBuildItem`, window="_blank"]
58475847
[.description]
58485848
--
5849-
Represents one `io.quarkus.oidc.token.propagation.AccessToken` annotation instance.
5850-
-- a|`java.lang.String clientName`
5851-
5852-
_No Javadoc found_
5853-
5854-
`boolean tokenExchange`
5849+
Contains non-default names of OIDC Clients.
5850+
-- a|`java.util.Set<String> oidcClientNames`
58555851
58565852
_No Javadoc found_
58575853

5858-
`org.jboss.jandex.AnnotationTarget annotationTarget`
58595854

5860-
_No Javadoc found_
5855+
|===
5856+
== OpenID Connect Token Propagation - Common
5857+
[.configuration-reference,cols=2*]
5858+
|===
5859+
h|Class Name
5860+
h|Attributes
58615861

58625862

58635863

58645864

5865-
a| https://github.com/quarkusio/quarkus/blob/main/extensions/oidc-client/deployment/src/main/java/io/quarkus/oidc/client/deployment/OidcClientNamesBuildItem.java[`io.quarkus.oidc.client.deployment.OidcClientNamesBuildItem`, window="_blank"]
5865+
a| https://github.com/quarkusio/quarkus/blob/main/extensions/oidc-token-propagation-common/deployment/src/main/java/io/quarkus/oidc/token/propagation/common/deployment/AccessTokenInstanceBuildItem.java[`io.quarkus.oidc.token.propagation.common.deployment.AccessTokenInstanceBuildItem`, window="_blank"]
58665866
[.description]
58675867
--
5868-
Contains non-default names of OIDC Clients.
5869-
-- a|`java.util.Set<String> oidcClientNames`
5868+
Represents one `io.quarkus.oidc.token.propagation.common.AccessToken` annotation instance.
5869+
-- a|`java.lang.String clientName`
5870+
5871+
_No Javadoc found_
5872+
5873+
`boolean tokenExchange`
5874+
5875+
_No Javadoc found_
5876+
5877+
`org.jboss.jandex.AnnotationTarget annotationTarget`
58705878

58715879
_No Javadoc found_
58725880

_versions/main/guides/grpc-service-consumption.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,12 @@ public class StreamingEndpoint {
204204

205205
For each gRPC service you inject in your application, you can configure the following attributes:
206206

207+
=== Global configuration
207208
include::{generated-dir}/config/quarkus-grpc_quarkus.grpc-client.adoc[opts=optional, leveloffset=+1]
208209

210+
=== Per-client configuration
211+
include::{generated-dir}/config/quarkus-grpc_quarkus.grpc.clients.adoc[opts=optional, leveloffset=+1]
212+
209213
The `client-name` is the name set in the `@GrpcClient` or derived from the injection point if not explicitly defined.
210214

211215
The following examples uses _hello_ as the client name.
124 KB
Loading

_versions/main/guides/observability-devservices-lgtm.adoc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,21 @@ image::observability-grafana-loki.png[alt=Dev UI LGTM, align=center,width=90%]
163163

164164
=== The dashboards
165165

166-
The Dev Service includes a set of dashboards for metrics.
166+
The Dev Service includes a set of dashboards.
167167

168168
image::observability-grafana-dashboards.png[alt=Dev UI LGTM, align=center,width=90%]
169169

170170
Each dashboard is tuned for the specific application setup. The available dashboards are:
171171

172-
* *Quarkus Micrometer Metrics - OTLP*: to be used with the Micrometer OTLP registry extension
173-
* *Quarkus Micrometer Metrics - Prometheus*: to be used with the Micrometer Prometheus registry extension.
174-
* *Quarkus Micrometer OpenTelemetry*: to be used with the Micrometer to OpenTelemetry bridge extension.
172+
* *Quarkus Micrometer OpenTelemetry*: to be used with the Micrometer and OpenTelemetry extension.
173+
* *Quarkus Micrometer OTLP registry*: to be used with the Micrometer OTLP registry extension.
174+
* *Quarkus Micrometer Prometheus registry*: to be used with the Micrometer Prometheus registry extension.
175+
* *Quarkus OpenTelemetry Logging*: to view logs coming from the OpenTelemetry extension.
176+
175177

176178
[NOTE]
177179
====
178-
Some panels in the dashboards might take a few minutes to show data when their values are calculated over a sliding window of time.
180+
Some panels in the dashboards might take a few minutes to show accurate data when their values are calculated over a sliding time window.
179181
====
180182

181183
=== Additional configuration

_versions/main/guides/security-jwt.adoc

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ public class TokenSecuredResource {
145145
<7> Builds a response containing the caller's name, the `isSecure()` and `getAuthenticationScheme()` states of the request `SecurityContext`, and whether a non-null `JsonWebToken` was injected.
146146

147147
[[run-application]]
148-
=== Run the application
148+
=== Run the application in dev mode
149149

150-
Now, you are ready to run the application by using one of the following commands:
150+
Now, you are ready to run the application in dev mode by using one of the following commands:
151151

152152
include::{includes}/devtools/dev.adoc[]
153153

@@ -174,6 +174,12 @@ Now that the REST endpoint is running, you can access it by using a command line
174174
[source,shell]
175175
----
176176
$ curl http://127.0.0.1:8080/secured/permit-all; echo
177+
----
178+
179+
This command returns the following response:
180+
181+
[source,shell]
182+
----
177183
hello anonymous, isHttps: false, authScheme: null, hasJWT: false
178184
----
179185

@@ -263,6 +269,12 @@ Your output should be as follows:
263269
[source,shell]
264270
----
265271
$ curl -v http://127.0.0.1:8080/secured/roles-allowed; echo
272+
----
273+
274+
This command returns the following response:
275+
276+
[source,shell]
277+
----
266278
* Trying 127.0.0.1...
267279
* TCP_NODELAY set
268280
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
@@ -444,8 +456,6 @@ Next, use the following command to generate the JWT:
444456
[source,shell]
445457
----
446458
$ mvn exec:java -Dexec.mainClass=org.acme.security.jwt.GenerateToken -Dexec.classpathScope=test -Dsmallrye.jwt.sign.key.location=privateKey.pem
447-
448-
eyJraWQiOiJcL3ByaXZhdGVLZXkucGVtIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJqZG9lLXVzaW5nLWp3dC1yYmFjIiwiYXVkIjoidXNpbmctand0LXJiYWMiLCJ1cG4iOiJqZG9lQHF1YXJrdXMuaW8iLCJiaXJ0aGRhdGUiOiIyMDAxLTA3LTEzIiwiYXV0aF90aW1lIjoxNTUxNjU5Njc2LCJpc3MiOiJodHRwczpcL1wvcXVhcmt1cy5pb1wvdXNpbmctand0LXJiYWMiLCJyb2xlTWFwcGluZ3MiOnsiZ3JvdXAyIjoiR3JvdXAyTWFwcGVkUm9sZSIsImdyb3VwMSI6Ikdyb3VwMU1hcHBlZFJvbGUifSwiZ3JvdXBzIjpbIkVjaG9lciIsIlRlc3RlciIsIlN1YnNjcmliZXIiLCJncm91cDIiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoiamRvZSIsImV4cCI6MTU1MTY1OTk3NiwiaWF0IjoxNTUxNjU5Njc2LCJqdGkiOiJhLTEyMyJ9.O9tx_wNNS4qdpFhxeD1e7v4aBNWz1FCq0UV8qmXd7dW9xM4hA5TO-ZREk3ApMrL7_rnX8z81qGPIo_R8IfHDyNaI1SLD56gVX-NaOLS2OjfcbO3zOWJPKR_BoZkYACtMoqlWgIwIRC-wJKUJU025dHZiNL0FWO4PjwuCz8hpZYXIuRscfFhXKrDX1fh3jDhTsOEFfu67ACd85f3BdX9pe-ayKSVLh_RSbTbBPeyoYPE59FW7H5-i8IE-Gqu838Hz0i38ksEJFI25eR-AJ6_PSUD0_-TV3NjXhF3bFIeT4VSaIZcpibekoJg0cQm-4ApPEcPLdgTejYHA-mupb8hSwg
449459
----
450460

451461
The JWT string is a Base64 URL-encoded string consisting of three parts, separated by `.` characters:
@@ -459,15 +469,19 @@ The JWT string is a Base64 URL-encoded string consisting of three parts, separat
459469
Now, let's use this to make a secured request to the `/secured/roles-allowed` endpoint.
460470
Make sure you have the Quarkus server still running in dev mode, and then run the following command, making sure to use your version of the generated JWT from the previous step:
461471

462-
[source,bash]
463-
----
464-
curl -H "Authorization: Bearer eyJraWQiOiJcL3ByaXZhdGVLZXkucGVtIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJqZG9lLXVzaW5nLWp3dC1yYmFjIiwiYXVkIjoidXNpbmctand0LXJiYWMiLCJ1cG4iOiJqZG9lQHF1YXJrdXMuaW8iLCJiaXJ0aGRhdGUiOiIyMDAxLTA3LTEzIiwiYXV0aF90aW1lIjoxNTUxNjUyMDkxLCJpc3MiOiJodHRwczpcL1wvcXVhcmt1cy5pb1wvdXNpbmctand0LXJiYWMiLCJyb2xlTWFwcGluZ3MiOnsiZ3JvdXAyIjoiR3JvdXAyTWFwcGVkUm9sZSIsImdyb3VwMSI6Ikdyb3VwMU1hcHBlZFJvbGUifSwiZ3JvdXBzIjpbIkVjaG9lciIsIlRlc3RlciIsIlN1YnNjcmliZXIiLCJncm91cDIiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoiamRvZSIsImV4cCI6MTU1MTY1MjM5MSwiaWF0IjoxNTUxNjUyMDkxLCJqdGkiOiJhLTEyMyJ9.aPA4Rlc4kw7n_OZZRRk25xZydJy_J_3BRR8ryYLyHTO1o68_aNWWQCgpnAuOW64svPhPnLYYnQzK-l2vHX34B64JySyBD4y_vRObGmdwH_SEufBAWZV7mkG3Y4mTKT3_4EWNu4VH92IhdnkGI4GJB6yHAEzlQI6EdSOa4Nq8Gp4uPGqHsUZTJrA3uIW0TbNshFBm47-oVM3ZUrBz57JKtr0e9jv0HjPQWyvbzx1HuxZd6eA8ow8xzvooKXFxoSFCMnxotd3wagvYQ9ysBa89bgzL-lhjWtusuMFDUVYwFqADE7oOSOD4Vtclgq8svznBQ-YpfTHfb9QEcofMlpyjNA" http://127.0.0.1:8080/secured/roles-allowed; echo
465-
----
466472

467473
.`curl` command for `/secured/roles-allowed` with JWT
468474
[source,shell]
469475
----
470476
$ curl -H "Authorization: Bearer eyJraWQ..." http://127.0.0.1:8080/secured/roles-allowed; echo
477+
----
478+
479+
Make sure to use the generated token as the HTTP Authorization Bearer scheme value.
480+
481+
This command returns the following response:
482+
483+
[source,shell]
484+
----
471485
hello [email protected], isHttps: false, authScheme: Bearer, hasJWT: true, birthdate: 2001-07-13
472486
----
473487

@@ -572,61 +586,60 @@ public class TokenSecuredResource {
572586

573587
Now generate the token again and run:
574588

575-
[source,bash]
589+
[source,shell]
576590
----
577-
curl -H "Authorization: Bearer eyJraWQiOiJcL3ByaXZhdGVLZXkucGVtIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJqZG9lLXVzaW5nLWp3dC1yYmFjIiwiYXVkIjoidXNpbmctand0LXJiYWMiLCJ1cG4iOiJqZG9lQHF1YXJrdXMuaW8iLCJiaXJ0aGRhdGUiOiIyMDAxLTA3LTEzIiwiYXV0aF90aW1lIjoxNTUxNjUyMDkxLCJpc3MiOiJodHRwczpcL1wvcXVhcmt1cy5pb1wvdXNpbmctand0LXJiYWMiLCJyb2xlTWFwcGluZ3MiOnsiZ3JvdXAyIjoiR3JvdXAyTWFwcGVkUm9sZSIsImdyb3VwMSI6Ikdyb3VwMU1hcHBlZFJvbGUifSwiZ3JvdXBzIjpbIkVjaG9lciIsIlRlc3RlciIsIlN1YnNjcmliZXIiLCJncm91cDIiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoiamRvZSIsImV4cCI6MTU1MTY1MjM5MSwiaWF0IjoxNTUxNjUyMDkxLCJqdGkiOiJhLTEyMyJ9.aPA4Rlc4kw7n_OZZRRk25xZydJy_J_3BRR8ryYLyHTO1o68_aNWWQCgpnAuOW64svPhPnLYYnQzK-l2vHX34B64JySyBD4y_vRObGmdwH_SEufBAWZV7mkG3Y4mTKT3_4EWNu4VH92IhdnkGI4GJB6yHAEzlQI6EdSOa4Nq8Gp4uPGqHsUZTJrA3uIW0TbNshFBm47-oVM3ZUrBz57JKtr0e9jv0HjPQWyvbzx1HuxZd6eA8ow8xzvooKXFxoSFCMnxotd3wagvYQ9ysBa89bgzL-lhjWtusuMFDUVYwFqADE7oOSOD4Vtclgq8svznBQ-YpfTHfb9QEcofMlpyjNA" http://127.0.0.1:8080/secured/roles-allowed-admin; echo
591+
$ curl -H "Authorization: Bearer eyJraWQ..." http://127.0.0.1:8080/secured/roles-allowed-admin; echo
578592
----
579593

594+
Make sure to use the generated token as the HTTP Authorization Bearer scheme value.
595+
596+
This command returns the following response:
597+
580598
[source,shell]
581599
----
582-
$ curl -H "Authorization: Bearer eyJraWQ..." http://127.0.0.1:8080/secured/roles-allowed-admin; echo
583600
hello [email protected], isHttps: false, authScheme: Bearer, hasJWT: true, birthdate: 2001-07-13
584601
----
585602

586-
=== Package and run the application
603+
=== Run the application in JVM mode
587604

588-
As usual, the application can be packaged by using:
605+
You can run the application as a standard Java application.
589606

607+
. Compile the application:
608+
+
609+
====
590610
include::{includes}/devtools/build.adoc[]
591-
592-
And executed by using `java -jar target/quarkus-app/quarkus-run.jar`:
593-
594-
.Runner jar example
595-
[source,shell,subs=attributes+]
611+
====
612+
. Run the application:
613+
+
614+
====
615+
[source,bash]
596616
----
597-
$ java -jar target/quarkus-app/quarkus-run.jar
598-
2019-03-28 14:27:48,839 INFO [io.quarkus] (main) Quarkus {quarkus-version} started in 0.796s. Listening on: http://[::]:8080
599-
2019-03-28 14:27:48,841 INFO [io.quarkus] (main) Installed features: [cdi, rest, rest-jackson, security, smallrye-jwt]
617+
java -jar target/quarkus-app/quarkus-run.jar
600618
----
619+
====
601620

602-
You can also generate the native executable with:
621+
=== Run the application in native mode
603622

604-
include::{includes}/devtools/build-native.adoc[]
623+
You can compile this same demo into native mode without any modifications.
624+
This implies that you no longer need to install a JVM on your production environment.
625+
The runtime technology is included in the produced binary and optimized to run with minimal resources required.
605626

606-
.Native executable example
607-
[source,shell]
627+
Compilation takes a bit longer, so this step is disabled by default.
628+
629+
. Build your application again by enabling the `native` profile:
630+
+
631+
====
632+
633+
include::{includes}/devtools/build-native.adoc[]
634+
====
635+
. Run the following binary directly:
636+
+
637+
====
638+
[source,bash]
608639
----
609-
[INFO] Scanning for projects...
610-
...
611-
[security-jwt-quickstart-runner:25602] universe: 493.17 ms
612-
[security-jwt-quickstart-runner:25602] (parse): 660.41 ms
613-
[security-jwt-quickstart-runner:25602] (inline): 1,431.10 ms
614-
[security-jwt-quickstart-runner:25602] (compile): 7,301.78 ms
615-
[security-jwt-quickstart-runner:25602] compile: 10,542.16 ms
616-
[security-jwt-quickstart-runner:25602] image: 2,797.62 ms
617-
[security-jwt-quickstart-runner:25602] write: 988.24 ms
618-
[security-jwt-quickstart-runner:25602] [total]: 43,778.16 ms
619-
[INFO] ------------------------------------------------------------------------
620-
[INFO] BUILD SUCCESS
621-
[INFO] ------------------------------------------------------------------------
622-
[INFO] Total time: 51.500 s
623-
[INFO] Finished at: 2019-03-28T14:30:56-07:00
624-
[INFO] ------------------------------------------------------------------------
625-
626-
$ ./target/security-jwt-quickstart-runner
627-
2019-03-28 14:31:37,315 INFO [io.quarkus] (main) Quarkus 0.12.0 started in 0.006s. Listening on: http://[::]:8080
628-
2019-03-28 14:31:37,316 INFO [io.quarkus] (main) Installed features: [cdi, rest, rest-jackson, security, smallrye-jwt]
640+
./target/security-jwt-quickstart-1.0.0-SNAPSHOT-runner
629641
----
642+
====
630643

631644
=== Explore the solution
632645

_versions/main/guides/security-oidc-auth0-tutorial.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,7 @@ import jakarta.ws.rs.Produces;
708708
import jakarta.ws.rs.core.MediaType;
709709
710710
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
711-
import io.quarkus.oidc.token.propagation.AccessToken;
711+
import io.quarkus.oidc.token.propagation.common.AccessToken;
712712
713713
@RegisterRestClient
714714
@AccessToken <1>

_versions/main/guides/security-oidc-bearer-token-authentication-tutorial.adoc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,16 @@ For more information, see the Keycloak documentation about link:https://www.keyc
231231
ifndef::no-quarkus-keycloak-admin-client[]
232232
[NOTE]
233233
====
234-
If you want to use the Keycloak Admin Client to configure your server from your application, you need to include either the `quarkus-keycloak-admin-rest-client` or the `quarkus-keycloak-admin-resteasy-client` (if the application uses `quarkus-rest-client`) extension.
234+
To configure the Keycloak server from your application by using the Keycloak Admin Client, include one of the following extensions based on your setup:
235+
236+
- *For Quarkus REST*: If you are using `quarkus-rest`, `quarkus-rest-client`, or both, include the `quarkus-keycloak-admin-rest-client` extension.
237+
238+
- *For RESTEasy Classic*: If you are using `quarkus-resteasy`, `quarkus-resteasy-client`, or both, include the `quarkus-keycloak-admin-resteasy-client` extension.
239+
240+
- *If no REST layer is explicitly used*: It is recommended to include the `quarkus-keycloak-admin-rest-client` extension.
241+
242+
These guidelines ensure seamless integration of the Keycloak Admin Client with your REST framework, whether you are working with a REST server, a REST client, or both.
243+
235244
For more information, see the xref:security-keycloak-admin-client.adoc[Quarkus Keycloak Admin Client] guide.
236245
====
237246
endif::no-quarkus-keycloak-admin-client[]

_versions/main/guides/security-oidc-code-flow-authentication.adoc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ For information about how to support multiple tenants, see xref:security-openid-
5050

5151
== Using the authorization code flow mechanism
5252

53+
=== Configuring Quarkus to support authorization code flow
54+
55+
To enable an authorization code flow authentication, the `quarkus.oidc.application-type` property must be set to `web-app`.
56+
Usually, the Quarkus OIDC `web-app` application type must be set when your Quarkus application is a frontend application which serves HTML pages and requires an OIDC single sign-on login.
57+
For the Quarkus OIDC `web-app` application, the authorization code flow is defined as the preferred method for authenticating users.
58+
When your application serves HTML pages and provides REST API at the same time, and requires both the authorization code flow authentication and xref:security-oidc-bearer-token-authentication.adoc[the bearer access token authentication], the `quarkus.oidc.application-type` property can be set to `hybrid` instead.
59+
In this case, the authorization code flow is only triggered when an HTTP `Authorization` request header with a `Bearer` authorization scheme containing a bearer access token is not set.
60+
5361
=== Configuring access to the OIDC provider endpoint
5462

5563
The OIDC `web-app` application requires URLs of the OIDC provider's authorization, token, `JsonWebKey` (JWK) set, and possibly the `UserInfo`, introspection and end-session (RP-initiated logout) endpoints.
@@ -789,7 +797,7 @@ It applies to ID tokens and also to access tokens in a JWT format, if the `web-a
789797
[[jose4j-validator]]
790798
==== Jose4j Validator
791799

792-
You can register a custom [Jose4j Validator] to customize the JWT claim verification process. See xref:security-oidc-bearer-token-authentication.adoc#jose4j-validator[Jose4j] section for more information.
800+
You can register a custom Jose4j Validator to customize the JWT claim verification process. See the xref:security-oidc-bearer-token-authentication.adoc#jose4j-validator[Jose4j] section for more information.
793801

794802
=== Proof Key for Code Exchange (PKCE)
795803

0 commit comments

Comments
 (0)