Releases: openanalytics/shinyproxy
Release list
v2.6.1
-
Fix: update Spring Boot to 2.5.12 in order to mitigate CVE-2022-22965 See the GitHub issue for the latest updates on how this issue affects ShinyProxy.
-
Note: when using Redis for session persistence (e.g. when using the ShinyProxy Operator), you have to change the Redis configuration to use a different database (or a different namespace). By default, database
0is used, you must change this to use database1(or any other free database). Use thespring.redis.databaseproperty for this (see example). This change will require the users to re-login. This change is required because the data format of the session information has changed in Spring.A typical Redis session configuration should be changed from:
spring: session: store-type: redis redis: host: redis password: ${REDIS_PASSWORD}
to:
spring: session: store-type: redis redis: host: redis password: ${REDIS_PASSWORD} database: 1
v2.6.0
- add
proxy.default-stop-proxy-on-logoutoption to not stop apps on logout of a user (see docs) - add option to limit the maximum lifetime of an app (see docs)
- add
proxy.stop-proxies-on-shutdownoption to not stop apps on shutdown of ShinyProxy (see docs) - optionally restore running apps on startup (known as App Recovery)
- add
heartbeat-timeoutproperty to the specification of proxies (see docs) - allow to disable the
heartbeat-timeoutproperty (see docs) - add authentication information to SpEL context (see docs)
- add way to easily use runtime-values in SpEL (see docs)
- add
kubernetes-additional-persistent-manifestsoption to specification of apps. These Kubernetes manifests are created when an app starts, but are never removed (in contrast tokubernetes-additional-manifests) (see docs) - add
absolute_apps_running,absolute_users_logged_in,absolute_users_logged_inmetrics to Micrometer (i.e. Prometheus) metrics, providing a way more consistent and correct value - add
proxy.usage-stats-micrometer-prefixto optionally prefix Micrometer (i.e. Prometheus) metrics - add
target-pathoption to specification of apps (see docs) - add a fallback heartbeat system for when the app does not use websockets and does not send HTTP requests often enough. This makes it easier to run applications which do not have these functionalities (e.g. traditional server-rendered apps, static html files etc.).
- add
Restart appbutton to navigation bar - add
Stop appbutton to navigation bar - add mechanism to automatically reconnect the websocket connection in case it gets disconnected (see docs)
- add support for running multiple instances of the same app by a single user (see docs)
- add
hide-navbar-on-main-page-linkoption to the specification of apps. When this option is enabled, thesp_hide_navbarquery parameter will be added to the link on the main page to that app. This way you can control that an individual app is opened with the navbar hidden, while it is still possible to show the navbar for that app (by changing the URL). - automatically extend the lifetime of the session of a user when a websocket connection is active. This prevents the user from automatically getting logged out when using an app that only uses a websocket connection and no HTTP requests (see the corresponding GitHub issue)
- add support for using SpEL in
proxy.openid-logout-url(so thatid_token_hintcan be provided) (see docs) - add support for using
http.proxyHostandhttp.proxyPortsystem properties for HTTP requests made by the SAML component (e.g. to fetch SAML metadata), contributed by @bartleboeuf - updated admin page to show more information
- add support for grouping apps (see docs)
- add support for specifying metadata to an app that can be used in the template (see docs)
- add
access-usersproperty to proxy specification. This allows to configure a list of users that should have access to the app (see docs) - add
access-expressionproperty to proxy specification. This allows to configure a SpEL expression to determine whether a user has access to an app (see docs) - Operator: add
proxy.operator.force-transferoption. When enabled a user is automatically transferred to the latest ShinyProxy instance when not using any apps. This is checked both on the main page and before starting a new app (see the operator docs). - Operator: automatically transfer user to latest ShinyProxy instance before logging in and after logging out (see the operator docs).
- Operator: add
proxy.operator.show-transfer-message-app-pageoption (see the operator docs). - Operator: add
proxy.operator.show-transfer-message-main-pageoption (see the operator docs). - Fix: make issue form a client-side feature, such that current running app isn't closed
- Fix: make it possible to run Jupyter Notebooks using ShinyProxy
- Fix: make it easier to run Python Flask applications using ShinyProxy
- Fix: update jQuery library so that the Bootstrap collapse module properly works
- Fix: parsing of OIDC roles when these are provided as an embedded JSON string
- Fix: return JSON on the
DELETE /api/proxy/idAPI endpoint - Fix: show message when a login attempt is rejected because of an expired session
- Fix: ensure API is accessible using access token when using Keycloak
- Fix: cleanup any started container if user logs out during startup of an app
- Fix: all web assets (JavaScript and CSS files) are now included in ShinyProxy itself and not loaded from a CDN
- Fix: adapt the
proxy.same-site-cookieproperty so that it also changes the SameSite Policy for session cookies created by Undertow (i.e. the session cookie when not using Redis) - Fix: adapt the
server.secure-cookiesproperty so that it also changes the Secure flag for session cookies created by Spring (i.e. the session cookie when using Redis) - Fix: update all included dependencies
- Fix: do not show
undefinedin the browser when navigating away while an app is starting, for example, by logging out or navigating to the main page. - Fix: support parsing Keycloak JWKS information when it contains an ECDSA key
- Note: using
#{proxySpec.containerSpecs[0].env.get('SHINYPROXY_PUBLIC_PATH')}
in the specification of an app will no longer work. The code can be replaced
by#{proxy.getRuntimeValue('SHINYPROXY_PUBLIC_PATH')}(see the SpEL docs) - Note: change the default value for
proxy.same-site-cookietoLax, in order
to ensure compatibility with changes to cookies in browsers (see the docs)
When using SAML this value may need to be changed (see the docs) - Note: make sure to use
server.secure-cookies: truewhen usingproxy.same-site-cookie: None(e.g. for making SAML work properly), see the docs
v2.5.1
This release consists only of a security update. In previous releases, the SAML and Keycloak authentication backends did not protect against session fixation. If an attacker can deploy a malicious application in ShinyProxy or an attacker has control over web applications hosted on the same domain (or subdomain) of the ShinyProxy server, such an attacker was able to fix the session id of a user and ultimately hijack the session of a user. This requires the victim to either open the malicious app or webpage. Updating to ShinyProxy 2.5.1 or 2.6.0 is advised when using the Keycloak or SAML backend. Other authentication backends (e.g. OpenID Connect, LDAP) are not vulnerable. Therefore, it is possible to switch to
another authentication backend as a workaround.
-
Security Fix: enable session fixation protection when using SAML authentication
-
Security Fix: enable session fixation protection when using Keycloak authentication
Note: the documentation of the Keycloak library advices to not employ session fixation protection, since this breaks "universal logout". However, since this is a non-standard extension of the OIDC protocol, we prefer the security benefits of this protection over the "universal logout" feature.
v2.5.0
- add support for exposing Prometheus metrics
- add support for SAML Logout (using the
/saml/logoutendpoint), contributed by @DefensePoint - add support for SAML Single Logout (using the
/saml/SingleLogoutendpoint) - add option to log SAML attributes whenever a user authenticates using SAML (
proxy.saml.log-attributes) - expose SAML metadata on
/saml/metadataendpoint - properly handle receiving expired SAML credentials by redirecting the user to
/auth-errorand logging a warning message. - add option to configure the max authentication age of SAML credentials (
proxy.saml.max-authentication-age). - allow to specify the Same Site policy for Cookies (
proxy.same-site-cookie). - add load balancer support for SAML authentication, contributed by @johannestang.
- provide the
SHINYPROXY_PUBLIC_PATHenvironment variable to app containers in order to allow compatibility with Dash 1.3 and RStudio. [ - refactor label and annotations of application containers. These labels and annotations can be processed by monitoring software, such as Grafana Loki.
- allow to specify the query parameter
sp_hide_navbar=trueon app pages in order to hide the navbar. - Docker image was improved in order to reduce the image size (~300MB vs ~800MB). Note: the
/etc/shinyproxyconfig directory no longer exists. Configuration files should be placed inside the/opt/shinyproxy/application.ymldirectory. [ - Fix: ensure
SHINYPROXY_OIDC_ACCESS_TOKENis always set when using OIDC and Redis for session storage - Fix: ensure clicking back button after authenticating does not cause errors when using SAML with (Azure) Active Directory
- Fix: do not hardcode JS and CSS versions inside templates to allow easier upgrade
- Fix: prevent redirect-loop when using OIDC and email is missing in attributes
- Fix: handle stale session cookies and state when using OIDC (and Keycloak). This prevents errors when the user keeps an OIDC login page open for too long or using stale bookmarks.
- Fix: username not shown when using OIDC, SAML ...
See the full release notes (with pointers to the documentation) at https://shinyproxy.io/downloads/#250
2.4.3
- use GitHub Actions to test ShinyProxy against multiple Java and Kubernetes versions
- Fix: properly cleanup proxies at shutdown
- Fix: include health of Redis into readiness probe (but only when Redis is used)
- Fix: fix SAML and Kerberos authentication (since 2.4.2 it would throw an Exception at startup)
- Fix: take server context-path into account when redirecting to
/auth-error
2.4.2
- support any JDBC compatible database for storing usage statistics
- use database connection pooling for usage statistics (improves the performance and reliability of it)
- allow to use Spring Expression Language inside the
kubernetes-pod-patchesandkubernetes-additional-manifestsconfiguration properties - add
proxy.kubernetes.pod-wait-timeproperty to configure the time ShinyProxy waits for a Kubernetes pod to become ready - add warning when using the removed
server.use-forward-headersproperty - Fix: do not throw
StackOverflowExceptionwhen OpenID Connect throws an exception (e.g., when there is a configuration issue) - Fix: do not cause a redirect loop when ShinyProxy cannot verify an OpenID Connect token, but the user is correctly logged in (e.g., when there is a configuration issue)
- Fix: disable debug log level for
org.springframework.web.servlet.DispatcherServletsince it interfere with requests being proxied to the app - Fix: POST requests don't work when using OpenID Connect
- Fix: make heartbeat mechanism less intrusive such that it doesn't break the websockets connection. Especially useful on slow connections and when using Shiny apps with large plots.
2.4.1
2.4.0
- support arbitrary settings at app level for the Kubernetes backend using pod patches
- support for creating additional Kubernetes resources when an app starts and removing these when the app stops
- instrument ShinyProxy for deployment using a Kubernetes operator
- support Kubernetes liveness and readiness probes
- improved handling of concurrent users of a proxied resource (increase proxy client's queue size to 100)
- include version of ShinyProxy in startup messsage
- support logout redirection for SAML authentication (
proxy.saml.logout-url) - Fix: support compilation with both OpenJDK and Oracle JDK
- Fix: POST requests to apps a.o. large file uploads
- Fix: correct checksums generated by builds
- Fix: build snapshot Docker images and push to Docker Hub
- Fix: update dependencies so that Google Social Login is supported
2.3.1
- support hosting of Zeppelin notebooks on ShinyProxy (by using non-greedy pattern matching to get app name)
- possibility to set secure flag on cookies (
server.secureCookies) - set HttpOnly on cookies set by ShinyProxy
- set X-Frame-Options header using
server.frameOptions - perform CSRF check on the login form and set X-Content-Type-Options header to nosniff
- allow to set a forceAuthN flag when using SAML authentication (
proxy.saml.force-authn) - improved parsing of custom OIDC role claims
- improved support for the 'emails' claim in OIDC
- Fix: AJAX error when using Keycloak
- Fix: 'Error: 200' page in case of login expiration
- Fix: 404 when a user makes concurrent /app_direct calls;
- Fix: error when stopping containers in a different namespace;
- Fix: documentation for web service authentication