diff --git a/DEV_MODE.md b/DEV_MODE.md index cc0dfbb21..0339caeec 100644 --- a/DEV_MODE.md +++ b/DEV_MODE.md @@ -15,13 +15,13 @@ mvn clean install -am -pl platforms/quarkus/api -pl platforms/quarkus/ws To start the API ```bash qApiPath=platforms/quarkus/api -mvn $(test -f "$qApiPath/java.env" && sed -e "/^$/d" -e "/^#/d" "$qApiPath/java.env" | xargs -r -n1 printf "-D%s ") -f $qApiPath/pom.xml quarkus:dev +mvn $(test -f "$qApiPath/java.env" && sed -e "/^$/d" -e "/^#/d" "$qApiPath/java.env" | xargs -r -n1 printf -- "-D%s ") -f $qApiPath/pom.xml quarkus:dev ``` To start the WS ```bash qWsPath=platforms/quarkus/ws -mvn $(test -f "$qWsPath/java.env" && sed -e "/^$/d" -e "/^#/d" "$qWsPath/java.env" | xargs -r -n1 printf "-D%s ") -f $qWsPath/pom.xml quarkus:dev +mvn $(test -f "$qWsPath/java.env" && sed -e "/^$/d" -e "/^#/d" "$qWsPath/java.env" | xargs -r -n1 printf -- "-D%s ") -f $qWsPath/pom.xml quarkus:dev ``` To start the UI (Tested with node 10) diff --git a/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabResourceResolver.java b/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabResourceResolver.java index b8b74db26..23bc377dc 100644 --- a/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabResourceResolver.java +++ b/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabResourceResolver.java @@ -83,7 +83,7 @@ public GitLabResource resolve(String glUrl) { String group = AbstractResourceResolver.decode(matcher.group(1)); String project = AbstractResourceResolver.decode(matcher.group(2)); String branch = AbstractResourceResolver.decode(matcher.group(3)); - String path = AbstractResourceResolver.decode(matcher.group(4)); + String path = matcher.group(4); resource.setGroup(group); resource.setProject(project); resource.setBranch(branch); @@ -97,7 +97,7 @@ public GitLabResource resolve(String glUrl) { String subGroup = AbstractResourceResolver.decode(matcher.group(2)); String project = AbstractResourceResolver.decode(matcher.group(3)); String branch = AbstractResourceResolver.decode(matcher.group(4)); - String path = AbstractResourceResolver.decode(matcher.group(5)); + String path = matcher.group(5); resource.setGroup(group + "/" + subGroup); resource.setProject(project); resource.setBranch(branch); @@ -112,7 +112,7 @@ public GitLabResource resolve(String glUrl) { String subSubGroup = AbstractResourceResolver.decode(matcher.group(3)); String project = AbstractResourceResolver.decode(matcher.group(4)); String branch = AbstractResourceResolver.decode(matcher.group(5)); - String path = AbstractResourceResolver.decode(matcher.group(6)); + String path = matcher.group(6); resource.setGroup(group + "/" + subGroup + "/" + subSubGroup); resource.setProject(project); resource.setBranch(branch); diff --git a/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabSourceConnector.java b/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabSourceConnector.java index 8a25a9cb2..21a1138f2 100644 --- a/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabSourceConnector.java +++ b/back-end/hub-api/src/main/java/io/apicurio/hub/api/gitlab/GitLabSourceConnector.java @@ -638,7 +638,7 @@ private ResourceContent getResourceContentFromGitLab(GitLabResource resource) th String getContentUrl = this.endpoint("/api/v4/projects/:id/repository/files/:path") .bind("id", toEncodedId(resource)) .bind("path", toEncodedPath(resource)) - .queryParam("ref", toEncodedBranch(resource)) + .queryParam("ref", resource.getBranch()) .toString(); HttpGet get = new HttpGet(getContentUrl); @@ -691,7 +691,8 @@ public String createPullRequestFromZipContent(String repositoryUrl, String commi private String toId(String value) { try { - return URLEncoder.encode(value, StandardCharsets.UTF_8.name()); + return URLEncoder.encode(value, StandardCharsets.UTF_8.name()) + .replaceAll("\\+", "%20"); } catch (UnsupportedEncodingException e) { return value; } diff --git a/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/KeycloakAuthenticationFilter.java b/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/KeycloakAuthenticationFilter.java index 1ef333624..f6c80521f 100644 --- a/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/KeycloakAuthenticationFilter.java +++ b/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/KeycloakAuthenticationFilter.java @@ -17,6 +17,7 @@ package io.apicurio.hub.api.security; import java.io.IOException; +import java.util.Collections; import java.util.Objects; import java.util.stream.Collectors; @@ -68,10 +69,14 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha user.setEmail(token.getEmail()); user.setLogin(token.getPreferredUsername()); user.setName(token.getName()); - user.setRoles(token.getRealmAccess().getRoles().stream() - .map(StudioRole::forName) - .filter(Objects::nonNull) - .collect(Collectors.toUnmodifiableList())); + if (token.getRealmAccess() == null || token.getRealmAccess().getRoles() == null) { + user.setRoles(Collections.emptyList()); + } else { + user.setRoles(token.getRealmAccess().getRoles().stream() + .map(StudioRole::forName) + .filter(Objects::nonNull) + .collect(Collectors.toUnmodifiableList())); + } ((SecurityContext) security).setUser(user); ((SecurityContext) security).setToken(session.getTokenString()); } diff --git a/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/QuarkusAuthenticationFilter.java b/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/QuarkusAuthenticationFilter.java index 4bd322d12..3a9ec828d 100644 --- a/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/QuarkusAuthenticationFilter.java +++ b/back-end/hub-api/src/main/java/io/apicurio/hub/api/security/QuarkusAuthenticationFilter.java @@ -27,6 +27,7 @@ import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.Collections; import java.util.Objects; import java.util.stream.Collectors; @@ -64,14 +65,18 @@ public class QuarkusAuthenticationFilter implements Filter { user.setEmail(principal.getClaim("email")); user.setLogin(principal.getClaim("preferred_username")); user.setName(principal.getClaim("name")); - user.setRoles( - principal.getClaim("realm_access") - .getJsonArray("roles").stream() - .map(JsonString.class::cast) - .map(JsonString::getString) - .map(StudioRole::forName) - .filter(Objects::nonNull) - .collect(Collectors.toUnmodifiableList())); + if (!principal.containsClaim("realm_access") || principal.getClaim("realm_access").isNull("roles")) { + user.setRoles(Collections.emptyList()); + } else { + user.setRoles( + principal.getClaim("realm_access") + .getJsonArray("roles").stream() + .map(JsonString.class::cast) + .map(JsonString::getString) + .map(StudioRole::forName) + .filter(Objects::nonNull) + .collect(Collectors.toUnmodifiableList())); + } ((SecurityContext) security).setUser(user); ((SecurityContext) security).setToken(principal.getRawToken()); diff --git a/distro/docker-compose/docker-compose-as-postgre.yml b/distro/docker-compose/docker-compose-as-postgre.yml index f5e5c4c16..a21cecf0d 100644 --- a/distro/docker-compose/docker-compose-as-postgre.yml +++ b/distro/docker-compose/docker-compose-as-postgre.yml @@ -5,7 +5,7 @@ volumes: services: apicurio-studio-db: - image: 'postgres:9.6' + image: 'postgres:12.9' environment: POSTGRES_DB: ${AS_DATABASE} POSTGRES_USER: ${AS_DB_USER} diff --git a/distro/docker-compose/docker-compose.apicurio.yml b/distro/docker-compose/docker-compose.apicurio.yml index 73286604e..f7593eb53 100644 --- a/distro/docker-compose/docker-compose.apicurio.yml +++ b/distro/docker-compose/docker-compose.apicurio.yml @@ -1,9 +1,6 @@ version: '3' services: - - apicurio-studio-db: - apicurio-studio-ws: image: 'apicurio/apicurio-studio-ws:${APICURIO_WS_VERSION}' depends_on: [apicurio-studio-db] diff --git a/distro/docker-compose/docker-compose.keycloak-postgresql.yml b/distro/docker-compose/docker-compose.keycloak-postgresql.yml index dc5b7c725..c107011ae 100644 --- a/distro/docker-compose/docker-compose.keycloak-postgresql.yml +++ b/distro/docker-compose/docker-compose.keycloak-postgresql.yml @@ -6,7 +6,7 @@ volumes: services: jboss-keycloak-postgresql: - image: postgres + image: 'postgres:12.9' volumes: - postgres_data:/var/lib/postgresql/data environment: diff --git a/distro/docker-compose/keycloak/Dockerfile b/distro/docker-compose/keycloak/Dockerfile index 60fae48e5..cdc65c1af 100644 --- a/distro/docker-compose/keycloak/Dockerfile +++ b/distro/docker-compose/keycloak/Dockerfile @@ -1,3 +1,3 @@ -FROM jboss/keycloak:14.0.0 +FROM jboss/keycloak:16.1.0 ADD apicurio /opt/jboss/keycloak/themes/apicurio diff --git a/distro/docker-compose/setup.sh b/distro/docker-compose/setup.sh index 36bf334de..3b710f2e2 100755 --- a/distro/docker-compose/setup.sh +++ b/distro/docker-compose/setup.sh @@ -22,11 +22,11 @@ then export P=/apicurio fi -KC_ROOT_DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6) -KC_DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6) -KC_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6) -AS_SQL_ROOT_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6) -AS_DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6) +KC_ROOT_DB_PASSWORD=$(LC_CTYPE=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c6) +KC_DB_PASSWORD=$(LC_CTYPE=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c6) +KC_PASSWORD=$(LC_CTYPE=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c6) +AS_MYSQL_ROOT_PASSWORD=$(LC_CTYPE=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c6) +AS_DB_PASSWORD=$(LC_CTYPE=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c6) SERVICE_CLIENT_SECRET=$(uuidgen) @@ -35,7 +35,7 @@ sed 's/$HOST/'"$HOST_IP"'/g' $P/.env.template > $P/tmp; mv $P/tmp $P/.env sed 's/$KC_ROOT_DB_PASSWORD/'"$KC_ROOT_DB_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env sed 's/$KC_DB_PASSWORD/'"$KC_DB_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env sed 's/$KC_PASSWORD/'"$KC_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env -sed 's/$AS_SQL_ROOT_PASSWORD/'"$AS_SQL_ROOT_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env +sed 's/$AS_MYSQL_ROOT_PASSWORD/'"$AS_MYSQL_ROOT_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env sed 's/$AS_DB_PASSWORD/'"$AS_DB_PASSWORD"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env sed 's/$SERVICE_CLIENT_SECRET/'"$SERVICE_CLIENT_SECRET"'/g' $P/.env > $P/tmp; mv $P/tmp $P/.env diff --git a/distro/helm/Chart.yaml b/distro/helm/Chart.yaml index fd38deaa5..71b148985 100644 --- a/distro/helm/Chart.yaml +++ b/distro/helm/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: apicurio -version: Beta 2.46 +version: 2.46.0-beta description: API design studio type: application keywords: diff --git a/distro/helm/templates/NOTES.txt b/distro/helm/templates/NOTES.txt index ba04d67dc..571f618f2 100644 --- a/distro/helm/templates/NOTES.txt +++ b/distro/helm/templates/NOTES.txt @@ -11,7 +11,7 @@ Apicurio is available at https://{{ .Values.ui.hostname }} Keycloak that is defined is available on {{ .Values.keycloak.url }} {{- if .Values.ui.feature.microcks }} -Microks is enabled and available on {{ .Values.microcks.api.url }} +Microcks is enabled and available on {{ .Values.microcks.api.url }} {{- else }} -Microks is disabled +Microcks is disabled {{- end }} diff --git a/distro/helm/templates/_helpers.tpl b/distro/helm/templates/_helpers.tpl new file mode 100644 index 000000000..d4d4f9cd7 --- /dev/null +++ b/distro/helm/templates/_helpers.tpl @@ -0,0 +1,7 @@ +{{- define "apicurio-studio.secretName" -}} +{{- if .Values.existingSecret }} + {{- printf "%s" .Values.existingSecret -}} +{{- else -}} +apicurio-secret +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/distro/helm/templates/apicurio-secrets.yaml b/distro/helm/templates/apicurio-secrets.yaml index b29758021..fbc2a4b2b 100644 --- a/distro/helm/templates/apicurio-secrets.yaml +++ b/distro/helm/templates/apicurio-secrets.yaml @@ -1,7 +1,8 @@ +{{- if not .Values.existingSecret }} apiVersion: v1 kind: Secret metadata: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} type: Opaque data: db-password: {{ .Values.database.password | b64enc }} @@ -9,3 +10,4 @@ data: db-user: {{ .Values.database.user | b64enc }} apicurio-kc-client-secret: {{ .Values.keycloak.client.secret | b64enc }} apicurio-microcks-client-secret: {{ .Values.microcks.client.secret | b64enc }} +{{- end }} \ No newline at end of file diff --git a/distro/helm/templates/apicurio-studio-api-deployment.yaml b/distro/helm/templates/apicurio-studio-api-deployment.yaml index 62905b000..a5fa6d4e4 100644 --- a/distro/helm/templates/apicurio-studio-api-deployment.yaml +++ b/distro/helm/templates/apicurio-studio-api-deployment.yaml @@ -29,14 +29,14 @@ spec: - name: APICURIO_DB_PASSWORD valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-password - name: APICURIO_DB_TYPE value: {{ .Values.database.type }} - name: APICURIO_DB_USER_NAME valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-user - name: APICURIO_MICROCKS_API_URL value: {{ .Values.microcks.api.url }} @@ -45,7 +45,7 @@ spec: - name: APICURIO_MICROCKS_CLIENT_SECRET valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: apicurio-microcks-client-secret - name: APICURIO_KC_AUTH_URL value: {{ .Values.keycloak.url }} @@ -56,7 +56,7 @@ spec: - name: APICURIO_KC_CLIENT_SECRET valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: apicurio-kc-client-secret - name: APICURIO_SHARE_FOR_EVERYONE value: {{ .Values.uiFeatureShareForEveryone | quote }} @@ -67,6 +67,12 @@ spec: imagePullPolicy: {{ .Values.api.imagePullPolicy }} ports: - containerPort: 8080 + + {{- if .Values.api.resources }} + resources: + {{- toYaml .Values.api.resources | nindent 12 }} + {{- end }} + {{- if .Values.api.extraVolumes }} volumeMounts: {{- range $volume := .Values.api.extraVolumes }} diff --git a/distro/helm/templates/apicurio-studio-db-deployment.yaml b/distro/helm/templates/apicurio-studio-db-deployment.yaml index 5d2b3efc6..84beea4a2 100644 --- a/distro/helm/templates/apicurio-studio-db-deployment.yaml +++ b/distro/helm/templates/apicurio-studio-db-deployment.yaml @@ -1,3 +1,5 @@ + +{{- if .Values.database.install }} apiVersion: apps/v1 kind: Deployment metadata: @@ -29,17 +31,17 @@ spec: - name: MYSQL_PASSWORD valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-password - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-root-password - name: MYSQL_USER valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-user image: {{ .Values.database.image }} imagePullPolicy: {{ .Values.database.imagePullPolicy }} @@ -61,3 +63,4 @@ spec: {{- end }} securityContext: fsGroup: 999 +{{- end }} \ No newline at end of file diff --git a/distro/helm/templates/apicurio-studio-ingresses.yaml b/distro/helm/templates/apicurio-studio-ingresses.yaml index 471f761b4..3e06f9cba 100644 --- a/distro/helm/templates/apicurio-studio-ingresses.yaml +++ b/distro/helm/templates/apicurio-studio-ingresses.yaml @@ -1,10 +1,13 @@ kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: {{ .Values.api.name }} annotations: #if subpath needed uncomment line and add to path beneath in specs nginx.ingress.kubernetes.io/rewrite-target: /$1 + {{- with .Values.ingress.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} labels: module: {{ .Values.api.name }} spec: @@ -13,16 +16,28 @@ spec: http: paths: - backend: - serviceName: {{ .Values.api.name }} - servicePort: {{ .Values.api.port }} + service: + name: {{ .Values.api.name }} + port: + number: {{ .Values.api.port }} path: /studio-api/?(.*) + pathType: Prefix + {{- if .Values.ingress.tls.enabled }} + tls: + - hosts: + - {{ .Values.ui.hostname }} + secretName: {{ .Values.ui.hostname }}-tls + {{- end }} --- kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: {{ .Values.ui.name }} annotations: # ingress.kubernetes.io/rewrite-target: / + {{- with .Values.ingress.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} labels: module: {{ .Values.ui.name }} spec: @@ -31,12 +46,21 @@ spec: http: paths: - backend: - serviceName: {{ .Values.ui.name }} - servicePort: {{ .Values.ui.port }} + service: + name: {{ .Values.ui.name }} + port: + number: {{ .Values.ui.port }} path: / + pathType: Prefix + {{- if .Values.ingress.tls.enabled }} + tls: + - hosts: + - {{ .Values.ui.hostname }} + secretName: {{ .Values.ui.hostname }}-tls + {{- end }} --- kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: {{ .Values.ws.name }} annotations: @@ -49,6 +73,9 @@ metadata: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; nginx.ingress.kubernetes.io/rewrite-target: /$1 + {{- with .Values.ingress.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} labels: module: {{ .Values.ws.name }} spec: @@ -57,6 +84,15 @@ spec: http: paths: - backend: - serviceName: {{ .Values.ws.name }} - servicePort: {{ .Values.ws.port }} + service: + name: {{ .Values.ws.name }} + port: + number: {{ .Values.ws.port }} path: /ws/?(.*) + pathType: Prefix + {{- if .Values.ingress.tls.enabled }} + tls: + - hosts: + - {{ .Values.ui.hostname }} + secretName: {{ .Values.ui.hostname }}-tls + {{- end }} diff --git a/distro/helm/templates/apicurio-studio-ui-deployment.yaml b/distro/helm/templates/apicurio-studio-ui-deployment.yaml index 07df3cd83..f0db3d4f7 100644 --- a/distro/helm/templates/apicurio-studio-ui-deployment.yaml +++ b/distro/helm/templates/apicurio-studio-ui-deployment.yaml @@ -29,7 +29,7 @@ spec: - name: APICURIO_KC_CLIENT_SECRET valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: apicurio-kc-client-secret - name: APICURIO_UI_FEATURE_MICROCKS value: {{ .Values.ui.feature.microcks | quote}} @@ -52,13 +52,18 @@ spec: - name: APICURIO_MICROCKS_CLIENT_SECRET valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: apicurio-microcks-client-secret image: {{ .Values.ui.image }} imagePullPolicy: {{ .Values.ui.imagePullPolicy }} name: {{ .Values.ui.name }} ports: - containerPort: 8080 + {{- if .Values.ui.resources }} + resources: + {{- toYaml .Values.ui.resources | nindent 12 }} + {{- end }} + {{- if .Values.ui.extraVolumes }} volumeMounts: {{- range $volume := .Values.ui.extraVolumes }} diff --git a/distro/helm/templates/apicurio-studio-ws-deployment.yaml b/distro/helm/templates/apicurio-studio-ws-deployment.yaml index 9684abf72..138b36d57 100644 --- a/distro/helm/templates/apicurio-studio-ws-deployment.yaml +++ b/distro/helm/templates/apicurio-studio-ws-deployment.yaml @@ -29,14 +29,14 @@ spec: - name: APICURIO_DB_PASSWORD valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-password - name: APICURIO_DB_TYPE value: {{ .Values.database.type }} - name: APICURIO_DB_USER_NAME valueFrom: secretKeyRef: - name: apicurio-secret + name: {{ include "apicurio-studio.secretName" . }} key: db-user - name: APICURIO_SHARE_FOR_EVERYONE value: {{ .Values.uiFeatureShareForEveryone | quote }} @@ -47,6 +47,11 @@ spec: name: {{ .Values.ws.name }} ports: - containerPort: 8080 + {{- if .Values.ws.resources }} + resources: + {{- toYaml .Values.ws.resources | nindent 12 }} + {{- end }} + {{- if .Values.ws.extraVolumes }} volumeMounts: {{- range $volume := .Values.ws.extraVolumes }} diff --git a/distro/helm/templates/mysql-apicurio-persistentvolumeclaim.yaml b/distro/helm/templates/mysql-apicurio-persistentvolumeclaim.yaml index 16c4dd517..3f11501d1 100644 --- a/distro/helm/templates/mysql-apicurio-persistentvolumeclaim.yaml +++ b/distro/helm/templates/mysql-apicurio-persistentvolumeclaim.yaml @@ -1,3 +1,4 @@ +{{- if .Values.database.install }} kind: PersistentVolumeClaim apiVersion: v1 metadata: @@ -8,3 +9,4 @@ spec: resources: requests: storage: 4Gi +{{- end }} \ No newline at end of file diff --git a/distro/helm/values.yaml b/distro/helm/values.yaml index 8e3adf538..f2c3e3479 100644 --- a/distro/helm/values.yaml +++ b/distro/helm/values.yaml @@ -37,6 +37,7 @@ ws: extraVolumes: [] database: + install: true name: apicurio-studio-db image: percona:5.7 port: 3306 @@ -74,3 +75,9 @@ keycloak: id: apicurio-studio #default secret secret: apicuriokc + +ingress: + tls: + enabled: false; + #annotations: + #kubernetes.io/ingress.class: nginx \ No newline at end of file diff --git a/distro/kubernetes/apicurio-studio-ingresses.yaml b/distro/kubernetes/apicurio-studio-ingresses.yaml index af9f0e225..7fc7a6b40 100644 --- a/distro/kubernetes/apicurio-studio-ingresses.yaml +++ b/distro/kubernetes/apicurio-studio-ingresses.yaml @@ -1,5 +1,5 @@ kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: apicurio-studio-api annotations: @@ -12,12 +12,15 @@ spec: http: paths: - backend: - serviceName: "apicurio-studio-api" - servicePort: 8091 + service: + name: "apicurio-studio-api" + port: + number: 8091 path: /studio-api/?(.*) + pathType: Prefix --- kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: apicurio-studio-ui labels: @@ -28,12 +31,15 @@ spec: http: paths: - backend: - serviceName: "apicurio-studio-ui" - servicePort: 8093 + service: + name: "apicurio-studio-ui" + port: + number: 8093 path: / + pathType: Prefix --- kind: Ingress -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 metadata: name: apicurio-studio-ws annotations: @@ -45,6 +51,9 @@ spec: http: paths: - backend: - serviceName: "apicurio-studio-ws" - servicePort: 8092 + service: + name: "apicurio-studio-ws" + port: + number: 8092 path: /designs + pathType: Prefix diff --git a/distro/kubernetes/apicurio-studio-ui-deployment.yaml b/distro/kubernetes/apicurio-studio-ui-deployment.yaml index ff3ece128..0c3554cc0 100644 --- a/distro/kubernetes/apicurio-studio-ui-deployment.yaml +++ b/distro/kubernetes/apicurio-studio-ui-deployment.yaml @@ -67,7 +67,7 @@ spec: - name: JAVA_TOOL_OPTIONS value: -Djava.net.preferIPv4Stack=true - name: APICURIO_UI_VALIDATION_CHANNELNAME_REGEXP - value: '{([^\x00-\x20\x7f"\'%<>\\^`{|}]|%[0-9A-Fa-f]{2}|\{[+#./;?&=,!@|]?((\w|%[0-9A-Fa-f]{2})(\.?(\w|%[0-9A-Fa-f]{2}))*(:[1-9]\d{0,3}|\*)?)(,((\w|%[0-9A-Fa-f]{2})(\.?(\w|%[0-9A-Fa-f]{2}))*(:[1-9]\d{0,3}|\*)?))*\})*' + value: "{([^\x00-\x20\x7f\\\"'%<>\\^`{|}]|%[0-9A-Fa-f]{2}|\\{[+#./;?&=,!@|]?((\\w|%[0-9A-Fa-f]{2})(\\.?(\\w|%[0-9A-Fa-f]{2}))*(:[1-9]\\d{0,3}|\\*)?)(,((\\w|%[0-9A-Fa-f]{2})(\\.?(\\w|%[0-9A-Fa-f]{2}))*(:[1-9]\\d{0,3}|\\*)?))*\\})*" - name: APICURIO_MICROCKS_API_URL valueFrom: configMapKeyRef: diff --git a/distro/openshift/auth/Dockerfile b/distro/openshift/auth/Dockerfile index 7874c76bd..7a7a1b2d5 100644 --- a/distro/openshift/auth/Dockerfile +++ b/distro/openshift/auth/Dockerfile @@ -1,7 +1,9 @@ -FROM jboss/keycloak:14.0.0 +FROM jboss/keycloak:16.1.0 LABEL authors="Eric Wittmann " +ENV JDBC_POSTGRES_VERSION 42.2.6 + USER root RUN mkdir -p /opt/jboss/keycloak/standalone/tmp/vfs \ diff --git a/distro/openshift/auth/docker-compose.yml b/distro/openshift/auth/docker-compose.yml new file mode 100644 index 000000000..d1cae6443 --- /dev/null +++ b/distro/openshift/auth/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' + +volumes: + keycloak_pg_data: + driver: local + +services: + keycloak-db: + image: 'postgres:12.9' + volumes: + - keycloak_pg_data:/var/lib/postgresql/data + environment: + POSTGRES_DB: keycloak + POSTGRES_USER: pgadmin + POSTGRES_PASSWORD: pgpassword + + keycloak: + image: 'apicurio/apicurio-studio-auth:16.1.0' + depends_on: [keycloak-db] + ports: + - '8090:8080' + environment: + APICURIO_KEYCLOAK_USER: admin + APICURIO_KEYCLOAK_PASSWORD: admin123 + APICURIO_UI_URL: http://localhost:8888 + DB_VENDOR: postgresql + DB_ADDR: keycloak-db + DB_DATABASE: keycloak + DB_USER: pgadmin + DB_PASSWORD: pgpassword + diff --git a/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/KeycloakAuthenticationFilter.java b/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/KeycloakAuthenticationFilter.java index f57547e7e..15ceae34f 100644 --- a/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/KeycloakAuthenticationFilter.java +++ b/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/KeycloakAuthenticationFilter.java @@ -17,6 +17,7 @@ package io.apicurio.studio.fe.servlet.filters; import java.io.IOException; +import java.util.Collections; import java.util.Objects; import java.util.stream.Collectors; @@ -78,10 +79,14 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha user.setEmail(token.getEmail()); user.setLogin(token.getPreferredUsername()); user.setName(token.getName()); - user.setRoles(token.getRealmAccess().getRoles().stream() - .map(StudioRole::forName) - .filter(Objects::nonNull) - .collect(Collectors.toUnmodifiableList())); + if (token.getRealmAccess() == null || token.getRealmAccess().getRoles() == null) { + user.setRoles(Collections.emptyList()); + } else { + user.setRoles(token.getRealmAccess().getRoles().stream() + .map(StudioRole::forName) + .filter(Objects::nonNull) + .collect(Collectors.toUnmodifiableList())); + } httpSession.setAttribute(RequestAttributeKeys.USER_KEY, user); } } diff --git a/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/QuarkusAuthenticationFilter.java b/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/QuarkusAuthenticationFilter.java index 6e440e1ec..258f88ac2 100644 --- a/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/QuarkusAuthenticationFilter.java +++ b/front-end/servlet/src/main/java/io/apicurio/studio/fe/servlet/filters/QuarkusAuthenticationFilter.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.util.Collections; import java.util.Objects; import java.util.stream.Collectors; @@ -73,14 +74,18 @@ public class QuarkusAuthenticationFilter implements Filter { user.setEmail(principal.getClaim("email")); user.setLogin(principal.getClaim("preferred_username")); user.setName(principal.getClaim("name")); - user.setRoles( - principal.getClaim("realm_access") - .getJsonArray("roles").stream() - .map(JsonString.class::cast) - .map(JsonString::getString) - .map(StudioRole::forName) - .filter(Objects::nonNull) - .collect(Collectors.toUnmodifiableList())); + if (!principal.containsClaim("realm_access") || principal.getClaim("realm_access").isNull("roles")) { + user.setRoles(Collections.emptyList()); + } else { + user.setRoles( + principal.getClaim("realm_access") + .getJsonArray("roles").stream() + .map(JsonString.class::cast) + .map(JsonString::getString) + .map(StudioRole::forName) + .filter(Objects::nonNull) + .collect(Collectors.toUnmodifiableList())); + } httpSession.setAttribute(RequestAttributeKeys.USER_KEY, user); chain.doFilter(request, response); diff --git a/front-end/studio/package.json b/front-end/studio/package.json index a9135227e..2f5a672df 100644 --- a/front-end/studio/package.json +++ b/front-end/studio/package.json @@ -18,13 +18,13 @@ "private": false, "peerDependencies": { "@patternfly/patternfly": "1.0.250", - "apicurio-data-models": "1.1.19", + "apicurio-data-models": "1.1.20", "apicurio-ts-core": "0.1.3", "brace": "0.11.1", "core-js": "2.6.5", "js-base64": "2.5.1", "js-yaml": "3.13.1", - "marked": "0.7.0", + "marked": "4.0.10", "moment": "2.23.0", "ngx-clipboard": "14.0.1", "patternfly": "3.59.1", @@ -48,7 +48,7 @@ "@types/js-base64": "2.3.1", "@types/marked": "0.6.1", "@types/node": "15.14.0", - "apicurio-data-models": "1.1.19", + "apicurio-data-models": "1.1.20", "apicurio-ts-core": "0.1.3", "brace": "0.11.1", "codelyzer": "^6.0.0", @@ -56,7 +56,7 @@ "cp-cli": "2.0.0", "js-base64": "2.5.1", "js-yaml": "3.13.1", - "marked": "0.7.0", + "marked": "4.0.10", "moment": "2.23.0", "ng-packagr": "^11.2.4", "ngx-bootstrap": "^7.0.0-rc.1", diff --git a/front-end/studio/src/app/components/common/activity-item.component.ts b/front-end/studio/src/app/components/common/activity-item.component.ts index 0c712fae0..3eb9e0086 100644 --- a/front-end/studio/src/app/components/common/activity-item.component.ts +++ b/front-end/studio/src/app/components/common/activity-item.component.ts @@ -46,7 +46,7 @@ export class ActivityItemComponent { /** * Get the command for this change. - * + * */ protected command(): ICommand { if (this._command == null) { @@ -78,7 +78,7 @@ export class ActivityItemComponent { /** * Returns an appropriate icon for the activity item, based on its type. - * + * */ public icon(): string { if (this.item.type == "Command") { @@ -111,6 +111,7 @@ export class ActivityItemComponent { case "AddChannelItemCommand": case "AddChildSchemaCommand": case "AddMessageExampleCommand_Aai20": + case "AddOneOfInMessageCommand": case "AddResponseDefinitionCommand": case "AddResponseDefinitionCommand_20": case "AddResponseDefinitionCommand_30": @@ -147,6 +148,7 @@ export class ActivityItemComponent { case "ChangeSchemaTypeCommand": case "ChangeResponseDefinitionTypeCommand": case "ChangeResponseDefinitionTypeCommand_20": + case "ChangePayloadRefCommand_Aai20": rval = "info"; break; case "ChangePropertyCommand": @@ -190,6 +192,7 @@ export class ActivityItemComponent { case "DeleteAllOperationsCommand_Aai20": case "DeleteAllParameterExamplesCommand": case "DeleteAllServersCommand_Aai20": + case "DeleteOneOfMessageCommand": case "DeleteMediaTypeCommand": case "DeleteOperationCommand": case "DeleteOperationCommand_20": @@ -368,7 +371,7 @@ export class ActivityItemComponent { /** * Returns an appropriate description for the activity item, based on its type. - * + * */ public description(): string { if (this.item.type == "Command") { @@ -409,6 +412,9 @@ export class ActivityItemComponent { case "AddResponseDefinitionCommand_30": rval = "added a Response Definition named " + this.command()["_newDefinitionName"] + "."; break; + case "AddOneOfInMessageCommand": + rval = "added a Message in a(n) component/operation (OneOf section) " + JSON.stringify(this.command()["_newOneOf"]) + "."; + break; case "AddSecurityRequirementCommand": rval = `added a Security Requirement at location ${this.command()["_parentPath"]}.`; break; @@ -452,6 +458,9 @@ export class ActivityItemComponent { case "ChangeResponseDefinitionTypeCommand_20": rval = "changed the type of an operation Response at location " + this.command()["_responsePath"] + "."; break; + case "ChangePayloadRefCommand_Aai20": + rval = "changed the payload of a message " + this.command()["_oldPayloadRef"] + "."; + break; case "ChangePropertyCommand": case "ChangePropertyCommand_20": case "ChangePropertyCommand_30": @@ -526,6 +535,9 @@ export class ActivityItemComponent { case "DeleteMediaTypeCommand": rval = "deleted Media Type '" + this.command()["_mediaTypeName"] + "' at location " + this.command()["_mediaTypePath"] + "."; break; + case "DeleteOneOfMessageCommand": + rval = "deleted Message from component/operation'" + JSON.stringify(this.command()["_oldMessage"]) + "."; + break; case "DeleteOperationCommand": case "DeleteOperationCommand_20": case "DeleteOperationCommand_30": diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.html b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.html index f759613d3..0bc09bda5 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.html +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.html @@ -15,11 +15,11 @@
-
- Inheritance Type OneOf -

- +
+ Inheritance Type OneOf +

+
diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.ts b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.ts index 0ce48b235..b2f94a8dd 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.ts +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/message-section.component.ts @@ -159,6 +159,21 @@ export class MessageSectionComponent extends AbstractBaseComponent { this.currentPart = part; } + public oneOfName(message: AaiMessage): string { + if (message && message.$ref) { + const r: any = this.deref(message); + if (r && r.getName && r.getName()) { + return r.getName(); + } else { + return message.$ref; + } + } else if (message.name) { + return message.name; + } else { + return "Unknown message"; + } + } + public deref(message: AaiMessage){ return ReferenceUtil.resolveFragmentFromJS(this.messageFromOperation().ownerDocument(), message.$ref); } @@ -210,4 +225,4 @@ export class MessageSectionComponent extends AbstractBaseComponent { } -} \ No newline at end of file +} diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/payload-tab.component.ts b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/payload-tab.component.ts index ffd161bcf..4f78fa701 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/payload-tab.component.ts +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/channel/operation/payload-tab.component.ts @@ -15,30 +15,23 @@ * limitations under the License. */ +import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewEncapsulation} from "@angular/core"; import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - Input, - SimpleChanges, - ViewEncapsulation -} from "@angular/core"; -import { + Aai20Schema, AaiComponents, AaiDocument, - AaiMessage, + AaiMessage, AaiOperation, - Aai20Schema, CommandFactory, ICommand, - SimplifiedType, + Library, ReferenceUtil, - Library + SimplifiedType } from "apicurio-data-models"; import {CommandService} from "../../../../_services/command.service"; import {DocumentService} from "../../../../_services/document.service"; import {AbstractBaseComponent} from "../../../common/base-component"; import {SelectionService} from "../../../../_services/selection.service"; -import { EditExampleEvent } from "../../../dialogs/edit-aai-example.component"; +import {EditExampleEvent} from "../../../dialogs/edit-aai-example.component"; @Component({ selector: "payload-tab", @@ -123,13 +116,14 @@ export class PayloadTabComponent extends AbstractBaseComponent { nt.of = newType.of; nt.as = newType.as; - let command: ICommand = CommandFactory.createChangePayloadRefCommand_Aai20(nt.type, this.message.parent() as AaiOperation); + let command: ICommand = CommandFactory.createChangePayloadRefCommand_Aai20$java_lang_String$io_apicurio_datamodels_asyncapi_models_AaiMessage(nt.type, this.message); this.commandService.emit(command); + this._model = nt; } public schemaForExamplePayload(): Aai20Schema { - if (this.message.payload.$ref) { + if (this.message.payload && this.message.payload.$ref) { return ReferenceUtil.resolveRef(this.message.payload.$ref, this.message) as Aai20Schema; } return null; @@ -195,4 +189,4 @@ export class PayloadTabComponent extends AbstractBaseComponent { let command: ICommand = CommandFactory.createDeleteAllMessageExamplesCommand_Aai20(this.message.parent() as AaiOperation); this.commandService.emit(command); } -} \ No newline at end of file +} diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/definition/oneof-row.component.html b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/definition/oneof-row.component.html index 486936689..452baa34b 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/definition/oneof-row.component.html +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/definition/oneof-row.component.html @@ -4,12 +4,11 @@ Reference
- {{oneOfName}} + {{displayOneOf()}}
-
- - {{item.oneOf}} - +
+ +
diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.css b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.css index a0bfe229b..af14b931b 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.css +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.css @@ -47,4 +47,11 @@ .response .response-examples a { cursor: pointer; +} + +.response .response-ref em { + font-style: normal; +} +.response .response-ref em > a { + font-weight: bold; } \ No newline at end of file diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.html b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.html index 82e581143..9ff1ca975 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.html +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.html @@ -1,5 +1,5 @@
-
+
Description
@@ -10,7 +10,7 @@
-
+
Response Type
@@ -20,7 +20,7 @@
-
+
Examples
@@ -54,6 +54,14 @@
+ +
+
Response Definition
+ + This response references the + {{ definitionName() }} + Response Definition. +
diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.ts b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.ts index 968f5d891..e86765297 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.ts +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/_components/forms/path/operation/response-tab.component.ts @@ -23,7 +23,7 @@ import { SimpleChanges, ViewEncapsulation } from "@angular/core"; -import {CommandFactory, ICommand, Library, Oas20Response, OasDocument, SimplifiedType} from "apicurio-data-models"; +import {CommandFactory, DocumentType, ICommand, Library, NodePath, Oas20Response, OasDocument, SimplifiedType} from "apicurio-data-models"; import {CommandService} from "../../../../_services/command.service"; import {DocumentService} from "../../../../_services/document.service"; import {EditExample20Event} from "../../../dialogs/edit-example-20.component"; @@ -50,6 +50,40 @@ export class ResponseTabComponent extends AbstractBaseComponent { super(changeDetectorRef, documentService, selectionService); } + isRef(): boolean { + return this.response.$ref !== null && this.response.$ref !== undefined; + } + + responseDefRefPrefix(): string { + let prefix: string = "#/components/responses/"; + if (this.response.ownerDocument().getDocumentType() === DocumentType.openapi2) { + prefix = "#/responses/"; + } + return prefix; + } + + responseDefPathPrefix(): string { + return this.responseDefRefPrefix().substr(1); + } + + definitionName(): string { + if (this.isRef()) { + let prefix: string = this.responseDefRefPrefix(); + let $ref: string = this.response.$ref; + if ($ref.startsWith(prefix)) { + return $ref.substr(prefix.length); + } + return this.response.$ref + } + return null; + } + + navigateToDefinition(): void { + let path: NodePath = new NodePath(this.responseDefPathPrefix()); + path.appendSegment(this.definitionName(), true); + this.selectionService.select(path.toString()); + } + protected onDocumentChange(): void { this._model = SimplifiedType.fromSchema(this.response.schema); } diff --git a/front-end/studio/src/app/pages/apis/{apiId}/editor/aaieditor.component.css b/front-end/studio/src/app/pages/apis/{apiId}/editor/aaieditor.component.css index f3462f0eb..40732bc8e 100644 --- a/front-end/studio/src/app/pages/apis/{apiId}/editor/aaieditor.component.css +++ b/front-end/studio/src/app/pages/apis/{apiId}/editor/aaieditor.component.css @@ -153,6 +153,28 @@ margin-right: 4px; } +.aai-editor .editor-master .editor-outline .api-message:hover { + background-color: #d1eaf7; +} + +.aai-editor .editor-master .editor-outline .api-message.selected { + background-color: #a5d6ef; + border-left: 2px solid #39a5dc; +} + +.aai-editor .editor-master .editor-outline .api-response.contexted, +.aai-editor .editor-master .editor-outline .api-response.contexted:hover, +.aai-editor .editor-master .editor-outline .api-message.contexted, +.aai-editor .editor-master .editor-outline .api-message.contexted:hover { + background-color: #FFCC87; + border-left: 2px dotted #E89F3D; +} + +.aai-editor .editor-master .editor-outline .api-message>* { + margin-right: 4px; +} + + .aai-editor .editor-master .editor-outline .api-response { -webkit-transition: background-color 200ms; -moz-transition: background-color 200ms; diff --git a/front-end/studio/yarn.lock b/front-end/studio/yarn.lock index e00f34975..30ff9a9f1 100644 --- a/front-end/studio/yarn.lock +++ b/front-end/studio/yarn.lock @@ -1840,7 +1840,7 @@ ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@6.12.6, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@6.12.6, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1850,16 +1850,6 @@ ajv@6.12.6, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.1.0: - version "6.9.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.2.tgz#4927adb83e7f48e5a32b45729744c71ec39c9c7b" - integrity sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^7.0.3: version "7.2.4" resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.2.4.tgz#8e239d4d56cf884bccca8cca362f508446dc160f" @@ -1952,12 +1942,12 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apicurio-data-models@1.1.19: - version "1.1.19" - resolved "https://registry.yarnpkg.com/apicurio-data-models/-/apicurio-data-models-1.1.19.tgz#41b0b10dfffec869e04ec5464c211926747fef3a" - integrity sha512-EZzXcYCU4eC2XNScovemMJ+xitZyPgApDHK53vbs1k3RJ2UFFzqcetEv6yGaHV6cGUcKo54+lr4oT7M2mrEZmw== +apicurio-data-models@1.1.20: + version "1.1.20" + resolved "https://registry.yarnpkg.com/apicurio-data-models/-/apicurio-data-models-1.1.20.tgz#d4fa723f94a29cff0a192443cc285bb709274901" + integrity sha512-cqq6ZqH3631pmHFUjuvTji5FmsThrPLpjmKwY7zp3IRPg5gSdXA32ZcAFa8aQgr9l9+OUp1mMMOdFaF4JIbwfA== dependencies: - core-js "3.19.0" + core-js "3.20.0" apicurio-ts-core@0.1.3: version "0.1.3" @@ -2649,7 +2639,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3072,10 +3062,10 @@ core-js@2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== -core-js@3.19.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.0.tgz#9e40098a9bc326c7e81b486abbd5e12b9d275176" - integrity sha512-L1TpFRWXZ76vH1yLM+z6KssLZrP8Z6GxxW4auoCj+XiViOzNPJCAuTIkn03BGdFe6Z5clX5t64wRIRypsZQrUg== +core-js@3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.0.tgz#1c5ac07986b8d15473ab192e45a2e115a4a95b79" + integrity sha512-KjbKU7UEfg4YPpskMtMXPhUKn7m/1OdTHTVjy09ScR2LVaoUXe8Jh0UdvN2EKUR6iKTJph52SJP95mAB0MnVLQ== core-js@3.8.3: version "3.8.3" @@ -4166,11 +4156,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -4187,16 +4172,11 @@ fast-glob@^3.1.1, fast-glob@^3.2.4: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.1.0: +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -4313,9 +4293,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + version "1.14.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" + integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== font-awesome-sass@^4.7.0: version "4.7.0" @@ -5806,10 +5786,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +marked@4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.10.tgz#423e295385cc0c3a70fa495e0df68b007b879423" + integrity sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw== md5.js@^1.3.4: version "1.3.5" @@ -6183,9 +6163,9 @@ nan@^2.9.2: integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== nanoid@^3.1.23: - version "3.1.23" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== nanomatch@^1.2.9: version "1.2.13" @@ -7042,6 +7022,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -7657,23 +7642,13 @@ postcss@8.2.15: nanoid "^3.1.23" source-map "^0.6.1" -postcss@^7.0.0, postcss@^7.0.1: - version "7.0.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" - integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.27, postcss@^7.0.35: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: - chalk "^2.4.2" + picocolors "^0.2.1" source-map "^0.6.1" - supports-color "^6.1.0" postcss@^8.1.4, postcss@^8.2.4: version "8.3.5" @@ -9439,9 +9414,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -9451,9 +9426,9 @@ urix@^0.1.0: integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-parse@^1.4.3, url-parse@^1.5.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" diff --git a/platforms/quarkus/api/src/main/resources/application.properties b/platforms/quarkus/api/src/main/resources/application.properties index 605a728bd..3d242e15c 100644 --- a/platforms/quarkus/api/src/main/resources/application.properties +++ b/platforms/quarkus/api/src/main/resources/application.properties @@ -22,11 +22,11 @@ quarkus.http.cors=true -studio.keycloak.url=${APICURIO_KC_AUTH_URL:http://localhost:8090} +studio.keycloak.url=${APICURIO_KC_AUTH_URL:http://localhost:8090/auth} studio.keycloak.realm=${APICURIO_KC_REALM:apicurio} quarkus.oidc.application-type=service -quarkus.oidc.auth-server-url=${studio.keycloak.url}/auth/realms/${studio.keycloak.realm} +quarkus.oidc.auth-server-url=${studio.keycloak.url}/realms/${studio.keycloak.realm} quarkus.oidc.client-id=${APICURIO_KC_CLIENT_ID:apicurio-api} quarkus.oidc.connection-delay=PT60S diff --git a/platforms/quarkus/ui/README.md b/platforms/quarkus/ui/README.md index dbbff848d..c8b16eac9 100644 --- a/platforms/quarkus/ui/README.md +++ b/platforms/quarkus/ui/README.md @@ -37,7 +37,9 @@ For both profiles you need to provide connection configuration for a oidc server |OIDC Realm|`-Dstudio.keycloak.realm`|`APICURIO_KC_REALM`| |OIDC Client ID|`-Dquarkus.oidc.client-id`|`APICURIO_KC_CLIENT_ID`| - +In `prod` profile, by default, the OIDC connector forces the `redirect_uri` to use `https://` URI - considering this component may be deployed behind a reverse proxy that handles the TLS termination. +To disable this behavior, you may set the `APICURIO_OIDC_REDIRECT_HTTPS` environment variable to `false`. + To see additional options, visit: - [OIDC Options](https://quarkus.io/guides/security-openid-connect) diff --git a/platforms/quarkus/ui/src/main/resources/application.properties b/platforms/quarkus/ui/src/main/resources/application.properties index e483d9778..e1bd8fa86 100644 --- a/platforms/quarkus/ui/src/main/resources/application.properties +++ b/platforms/quarkus/ui/src/main/resources/application.properties @@ -13,13 +13,18 @@ %prod.apicurio-ui.hub-api.url=${APICURIO_UI_HUB_API_URL:} %prod.apicurio-ui.validation.channelName.regexp=${APICURIO_UI_VALIDATION_CHANNELNAME_REGEXP:} +# When in container accessed with http, the OIDC does not detect https termination +# from the router/reverse proxy in front. We should force the redirection being https. +%prod.quarkus.oidc.authentication.force-redirect-https-scheme=${APICURIO_OIDC_REDIRECT_HTTPS:true} +%prod.quarkus.log.level=INFO + quarkus.http.cors=true -studio.keycloak.url=${APICURIO_KC_AUTH_URL:http://localhost:8090} +studio.keycloak.url=${APICURIO_KC_AUTH_URL:http://localhost:8090/auth} studio.keycloak.realm=${APICURIO_KC_REALM:apicurio} quarkus.oidc.application-type=web-app -quarkus.oidc.auth-server-url=${studio.keycloak.url}/auth/realms/${studio.keycloak.realm} +quarkus.oidc.auth-server-url=${studio.keycloak.url}/realms/${studio.keycloak.realm} quarkus.oidc.client-id=${APICURIO_KC_CLIENT_ID:apicurio-studio} quarkus.oidc.connection-delay=PT60S diff --git a/platforms/quarkus/ws/src/main/resources/application.properties b/platforms/quarkus/ws/src/main/resources/application.properties index 9c48a5e48..4a278cab7 100644 --- a/platforms/quarkus/ws/src/main/resources/application.properties +++ b/platforms/quarkus/ws/src/main/resources/application.properties @@ -20,6 +20,6 @@ %prod.quarkus.datasource.jdbc.max-size=8 %prod.quarkus.datasource.jdbc.min-size=2 %prod.quarkus.log.level=INFO - +%prod.quarkus.http.port=8080 quarkus.package.type=legacy-jar \ No newline at end of file diff --git a/pom.xml b/pom.xml index 166a226ba..4f516d486 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,7 @@ 1.1.21 1.3.2.Final - 1.0.2.Final + 1.0.4.Final 2.6.4 @@ -76,25 +76,25 @@ 3.0.0 3.3.0 - 1.4 + 3.0.0 3.1.0 - 3.8.1 + 3.10.0 3.2.0 2.8.2 - 3.1.2 + 4.1.3 2.5.2 - 3.2.0 - 3.3.1 + 3.2.2 + 3.3.2 1.6 - 1.6.8 + 1.6.12 3.2.0 3.2.1 2.22.2 2.22.2 3.3.2 - 1.12.0 - 4.5.4 - 1.2.1 + 1.12.1 + 4.5.6 + 1.2.2 1.0.0 @@ -112,31 +112,31 @@ 2.11.0 2.6 3.12.0 - 3.6.1 - 0.12.0 + 3.7.6 + 0.15.0 1.3.2 2.0 2.0.1 1.1.4 4.13.2 4.5.13 - 4.4.14 + 4.4.15 2.11.1 2.1.5 - 3.15.2.Final + 3.15.3.Final 1.0.2.Final 2.0.0.Final 2.0.2.Final 1.1.1.Final - 3.24.1 - 20210307 + 3.27.2 + 20211205 1.1.1 - 14.0.0 + 16.1.1 8.0.22 42.2.20 - 1.7.32 - 2.13.7 - 13.0.2.Final + 1.7.36 + 2.13.8 + 13.0.6.Final diff --git a/test/integration/arquillian/pom.xml b/test/integration/arquillian/pom.xml index dd7a34a25..46d2c85eb 100644 --- a/test/integration/arquillian/pom.xml +++ b/test/integration/arquillian/pom.xml @@ -30,7 +30,7 @@ ${basedir}/src/test/resources/artemis/broker.xml - 1.4.193 + 2.0.206 ${project.build.directory} diff --git a/test/integration/single-node-keycloak/pom.xml b/test/integration/single-node-keycloak/pom.xml index ad87300e4..02596ac99 100644 --- a/test/integration/single-node-keycloak/pom.xml +++ b/test/integration/single-node-keycloak/pom.xml @@ -115,7 +115,7 @@ com.codeborne selenide - 6.0.3 + 6.3.4 test