diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/nginx.conf b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/nginx.conf deleted file mode 100644 index 9e496b79d..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/nginx.conf +++ /dev/null @@ -1,261 +0,0 @@ -worker_processes 2; -error_log /var/logs/nginx/mydomain.error.log; -pid /var/run/nginx.pid; -include /usr/share/nginx/modules/*.conf; # See /usr/share/doc/nginx/README.dynamic. - -events { - worker_connections 1024; ## Default: 1024 - use epoll; # http://nginx.org/en/docs/events.html - multi_accept on; # http://nginx.org/en/docs/ngx_core_module.html#multi_accept -} - -# Core Modules Docs: -# http://nginx.org/en/docs/http/ngx_http_core_module.html -http { - include '/usr/local/openresty/nginx/conf/mime.types'; - default_type application/octet-stream; - - keepalive_timeout 65; - keepalive_requests 100000; - tcp_nopush on; - tcp_nodelay on; - - # lua_ settings - # - lua_package_path '/usr/local/openresty/lualib/?.lua;;/usr/local/share/lua/5.4/?.lua;;'; - lua_shared_dict discovery 1m; # cache for discovery metadata documents - lua_shared_dict jwks 1m; # cache for JWKs - # lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; - - variables_hash_max_size 2048; - server_names_hash_bucket_size 128; - server_tokens off; - - resolver 8.8.8.8 valid=30s ipv6=off; - resolver_timeout 11s; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - # No idea what this is doing - # https://stackoverflow.com/a/5877989/1867984 - # upstream upstream_server { - # # server 10.100.4.200:1010 max_fails=3 fail_timeout=30s; - # server 127.0.0.1: - # } - - # Nginx `listener` block - server { - listen [::]:80 default_server; - listen 80; - # listen 443 ssl; - access_log /var/logs/nginx/mydomain.access.log; - - # Domain to protect - server_name 127.0.0.1 localhost; # mydomain.com; - proxy_intercept_errors off; - # ssl_certificate /etc/letsencrypt/live/mydomain.co.uk/fullchain.pem; - # ssl_certificate_key /etc/letsencrypt/live/mydomain.co.uk/privkey.pem; - gzip on; - gzip_types text/css application/javascript application/json image/svg+xml; - gzip_comp_level 9; - etag on; - - # https://github.com/bungle/lua-resty-session/issues/15 - set $session_check_ssi off; - lua_code_cache off; - set $session_secret Eeko7aeb6iu5Wohch9Loo1aitha0ahd1; - set $session_storage cookie; - - server_tokens off; # Hides server version num - - # [PROTECTED] Reverse Proxy for `orthanc` admin - # - location /pacs-admin/ { - access_by_lua_block { - local opts = { - redirect_uri = "http://127.0.0.1/pacs-admin/admin", - discovery = "http://127.0.0.1/auth/realms/ohif/.well-known/openid-configuration", - token_endpoint_auth_method = "client_secret_basic", - client_id = "pacs", - client_secret = "66279641-eba6-47f5-9fdb-70c4ac74d548", - client_jwt_assertion_expires_in = 60 * 60, - ssl_verify = "no", - scope = "openid email profile", - refresh_session_interval = 900, - redirect_uri_scheme = "http", - redirect_after_logout_uri = "/", - session_contents = {id_token=true} - } - - -- call authenticate for OpenID Connect user authentication - local res, err = require("resty.openidc").authenticate(opts) - - if err or not res then - ngx.print(err) - ngx.status = 200 - ngx.say(err and err or "no access_token provided") - ngx.exit(ngx.HTTP_FORBIDDEN) - end - - -- Or set cookie? - -- ngx.req.set_header("Authorization", "Bearer " .. res.access_token) - ngx.req.set_header("X-USER", res.id_token.sub) - } - - - proxy_http_version 1.1; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - expires 0; - add_header Cache-Control private; - - proxy_pass http://orthanc:8042/; - } - - # [PROTECTED] Reverse Proxy for `orthanc` APIs (including DICOMWeb) - # - location /pacs/ { - access_by_lua_block { - local opts = { - discovery = "http://127.0.0.1/auth/realms/ohif/.well-known/openid-configuration", - } - - -- call bearer_jwt_verify for OAuth 2.0 JWT validation - local res, err = require("resty.openidc").bearer_jwt_verify(opts) - - if err or not res then - ngx.status = 403 - ngx.say(err and err or "no access_token provided") - ngx.exit(ngx.HTTP_FORBIDDEN) - end - } - - proxy_http_version 1.1; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; -# proxy_set_header Upgrade $http_upgrade; -# proxy_set_header Connection "upgrade"; - - expires 0; - add_header Cache-Control private; - - proxy_pass http://orthanc:8042/; - - # By default, this endpoint is protected by CORS (cross-origin-resource-sharing) - # You can add headers to allow other domains to request this resource. - # See the "Updating CORS Settings" example below - } - - # Keycloak - # - location /auth/ { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - - proxy_pass http://keycloak:8080/auth/; - } - - # Do not cache sw.js, required for offline-first updates. - location /sw.js { - add_header Cache-Control "no-cache"; - proxy_cache_bypass $http_pragma; - proxy_cache_revalidate on; - expires off; - access_log off; - } - - # Single Page App - # Try files, fallback to index.html - # - location / { - alias /var/www/html/; - index index.html; - try_files $uri $uri/ /index.html; - add_header Cache-Control "no-store, no-cache, must-revalidate"; - add_header 'Cross-Origin-Opener-Policy' 'same-origin' always; - add_header 'Cross-Origin-Embedder-Policy' 'require-corp' always; - } - - # EXAMPLE: Reverse Proxy, no auth - # [UNPROTECTED] reverse proxy for `orthanc` - # - # location /pacs/ { - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $remote_addr; - # proxy_set_header Host $host; - # - # proxy_pass http://orthanc:8042/; - # - # # OR - # # rewrite ^/pacs(.*) /$1 break; - # # proxy_pass http://orthanc:8042; - # } - - # EXAMPLE: Modifying headers to allow requests from other domains - # IE. Updating CORS settings - # - # location / { - # if ($request_method = 'OPTIONS') { - # add_header 'Access-Control-Allow-Origin' '*'; - # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; - # # - # # Custom headers and headers various browsers *should* be OK with but aren't - # # - # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; - # # - # # Tell client that this pre-flight info is valid for 20 days - # # - # add_header 'Access-Control-Allow-Headers' 'Authorization'; - # add_header 'Access-Control-Allow-Credentials' true; - # add_header 'Access-Control-Max-Age' 1728000; - # add_header 'Content-Length' 0; - # return 204; - # } - # if ($request_method = 'POST') { - # add_header 'Access-Control-Allow-Origin' '*'; - # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; - # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; - # add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; - # } - # if ($request_method = 'GET') { - # add_header 'Access-Control-Allow-Origin' '*'; - # add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; - # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; - # add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; - # add_header 'Access-Control-Allow-Headers' 'Authorization'; - # add_header 'Access-Control-Allow-Credentials' true; - # } - # - # # proxy_http_version 1.1; - # - # # proxy_set_header Host $host; - # # proxy_set_header X-Real-IP $remote_addr; - # # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # # proxy_set_header X-Forwarded-Proto $scheme; - # - # proxy_pass http://orthanc:8042; - # } - - # EXAMPLE: Redirect server error pages to the static page /40x.html - # - # error_page 404 /404.html; - # location = /40x.html { - # } - - # EXAMPLE: Redirect server error pages to the static page /50x.html - # - # error_page 500 502 503 504 /50x.html; - # location = /50x.html { - # } - } -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/ohif-keycloak-realm.json b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/ohif-keycloak-realm.json deleted file mode 100644 index 4716e1592..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/ohif-keycloak-realm.json +++ /dev/null @@ -1,1788 +0,0 @@ -{ - "id": "ohif", - "realm": "ohif", - "displayName": "OHIF", - "displayNameHtml": "
OHIF
", - "notBefore": 0, - "revokeRefreshToken": false, - "refreshTokenMaxReuse": 0, - "accessTokenLifespan": 300, - "accessTokenLifespanForImplicitFlow": 900, - "ssoSessionIdleTimeout": 1800, - "ssoSessionMaxLifespan": 36000, - "ssoSessionIdleTimeoutRememberMe": 0, - "ssoSessionMaxLifespanRememberMe": 0, - "offlineSessionIdleTimeout": 2592000, - "offlineSessionMaxLifespanEnabled": false, - "offlineSessionMaxLifespan": 5184000, - "accessCodeLifespan": 60, - "accessCodeLifespanUserAction": 300, - "accessCodeLifespanLogin": 1800, - "actionTokenGeneratedByAdminLifespan": 43200, - "actionTokenGeneratedByUserLifespan": 300, - "enabled": true, - "sslRequired": "external", - "registrationAllowed": false, - "registrationEmailAsUsername": false, - "rememberMe": false, - "verifyEmail": false, - "loginWithEmailAllowed": true, - "duplicateEmailsAllowed": false, - "resetPasswordAllowed": false, - "editUsernameAllowed": false, - "bruteForceProtected": false, - "permanentLockout": false, - "maxFailureWaitSeconds": 900, - "minimumQuickLoginWaitSeconds": 60, - "waitIncrementSeconds": 60, - "quickLoginCheckMilliSeconds": 1000, - "maxDeltaTimeSeconds": 43200, - "failureFactor": 30, - "roles": { - "realm": [ - { - "id": "6c3af6bd-09e5-41ab-a997-ecb926e06a9c", - "name": "offline_access", - "description": "${role_offline-access}", - "composite": false, - "clientRole": false, - "containerId": "ohif", - "attributes": {} - }, - { - "id": "eb61ea0f-059d-4aeb-8179-6d223882be4e", - "name": "uma_authorization", - "description": "${role_uma_authorization}", - "composite": false, - "clientRole": false, - "containerId": "ohif", - "attributes": {} - } - ], - "client": { - "realm-management": [ - { - "id": "20b8764b-3db0-47bf-80f3-fdc5e2a80651", - "name": "view-events", - "description": "${role_view-events}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "b85a57ed-b33a-41b2-8748-d02f9f334b42", - "name": "realm-admin", - "description": "${role_realm-admin}", - "composite": true, - "composites": { - "client": { - "realm-management": [ - "view-events", - "query-realms", - "query-groups", - "manage-clients", - "query-clients", - "impersonation", - "manage-identity-providers", - "view-identity-providers", - "query-users", - "manage-realm", - "manage-authorization", - "view-authorization", - "view-realm", - "manage-users", - "view-clients", - "manage-events", - "create-client", - "view-users" - ] - } - }, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "5fdc7311-003e-4644-b497-3b88f0fd2771", - "name": "query-realms", - "description": "${role_query-realms}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "cb1ebb2f-7772-417e-8ed6-9f144e53aa66", - "name": "query-groups", - "description": "${role_query-groups}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "0c2b9722-d7cb-49c1-9eba-216b8485f0a9", - "name": "manage-clients", - "description": "${role_manage-clients}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "e60cd69e-6ebb-4e2b-aefc-7529f62bd410", - "name": "query-clients", - "description": "${role_query-clients}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "003085ed-b327-4dc2-bcfe-b97f25dbfdb2", - "name": "impersonation", - "description": "${role_impersonation}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "97678c0b-a333-443b-af67-39be0c9b9656", - "name": "manage-identity-providers", - "description": "${role_manage-identity-providers}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "f96be28a-ed19-4e0c-a2cc-85ba3daed401", - "name": "view-identity-providers", - "description": "${role_view-identity-providers}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "081be3e8-f3a9-4d2a-94ee-ec357082d019", - "name": "query-users", - "description": "${role_query-users}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "376fec14-86c7-4986-8f09-9d4b93880c57", - "name": "manage-realm", - "description": "${role_manage-realm}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "1c105710-6a0e-40bb-8e45-924017eff426", - "name": "manage-authorization", - "description": "${role_manage-authorization}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "6f0f4bad-7761-487d-babd-62500ca02380", - "name": "view-authorization", - "description": "${role_view-authorization}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "089145da-eb3c-4a06-a623-01f1c0278710", - "name": "view-realm", - "description": "${role_view-realm}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "59cf0f7d-0ccc-4b2d-ab23-dd00a95727d2", - "name": "manage-users", - "description": "${role_manage-users}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "bbf8231a-f92c-4c7d-a962-f1ffc3a77486", - "name": "view-clients", - "description": "${role_view-clients}", - "composite": true, - "composites": { - "client": { - "realm-management": ["query-clients"] - } - }, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "b76f0563-eb1a-4e85-853d-2c5fd41820ab", - "name": "manage-events", - "description": "${role_manage-events}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "bc00ccc2-f675-4649-a1fc-0138da85c2ef", - "name": "create-client", - "description": "${role_create-client}", - "composite": false, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - }, - { - "id": "982241da-f30d-4a9b-a425-d69fb5f1b0ee", - "name": "view-users", - "description": "${role_view-users}", - "composite": true, - "composites": { - "client": { - "realm-management": ["query-groups", "query-users"] - } - }, - "clientRole": true, - "containerId": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "attributes": {} - } - ], - "pacs": [ - { - "id": "46283d0b-9b8b-46f2-a111-dfa460103f2f", - "name": "uma_protection", - "composite": false, - "clientRole": true, - "containerId": "3785434d-2af8-478c-b135-f0b11d1d3205", - "attributes": {} - } - ], - "security-admin-console": [], - "admin-cli": [], - "broker": [ - { - "id": "49b1694a-21f5-4eb0-a9c4-4f847313d722", - "name": "read-token", - "description": "${role_read-token}", - "composite": false, - "clientRole": true, - "containerId": "f7f76add-411b-420d-9be1-bd120ed99918", - "attributes": {} - } - ], - "ohif-viewer": [], - "account": [ - { - "id": "6ae38e13-39e5-4000-962f-ef0175f57c60", - "name": "manage-account-links", - "description": "${role_manage-account-links}", - "composite": false, - "clientRole": true, - "containerId": "e6bee9db-9634-4cd2-93d3-cdaa1f011dd8", - "attributes": {} - }, - { - "id": "368522c4-b8f0-40af-ac53-b96496c4a44a", - "name": "manage-account", - "description": "${role_manage-account}", - "composite": true, - "composites": { - "client": { - "account": ["manage-account-links"] - } - }, - "clientRole": true, - "containerId": "e6bee9db-9634-4cd2-93d3-cdaa1f011dd8", - "attributes": {} - }, - { - "id": "af2a7fbc-38da-49cd-8495-c798530fe251", - "name": "view-profile", - "description": "${role_view-profile}", - "composite": false, - "clientRole": true, - "containerId": "e6bee9db-9634-4cd2-93d3-cdaa1f011dd8", - "attributes": {} - } - ] - } - }, - "groups": [], - "defaultRoles": ["offline_access", "uma_authorization"], - "requiredCredentials": ["password"], - "otpPolicyType": "totp", - "otpPolicyAlgorithm": "HmacSHA1", - "otpPolicyInitialCounter": 0, - "otpPolicyDigits": 6, - "otpPolicyLookAheadWindow": 1, - "otpPolicyPeriod": 30, - "otpSupportedApplications": ["FreeOTP", "Google Authenticator"], - "scopeMappings": [ - { - "clientScope": "offline_access", - "roles": ["offline_access"] - } - ], - "clients": [ - { - "id": "315fbb4d-f9c8-46f6-888e-d6c69d415ee0", - "clientId": "admin-cli", - "name": "${client_admin-cli}", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": false, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - }, - { - "id": "84e7b84d-ab74-452e-8a24-a0e657f100ea", - "clientId": "realm-management", - "name": "${client_realm-management}", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": true, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - }, - { - "id": "f7dd8587-4035-4590-a1c0-ebf576c4dfe3", - "clientId": "security-admin-console", - "name": "${client_security-admin-console}", - "baseUrl": "/auth/admin/ohif/console/index.html", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "redirectUris": ["/auth/admin/ohif/console/*"], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "protocolMappers": [ - { - "id": "3c48b046-72a2-4779-abb5-760c58fe2c19", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - } - ], - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - }, - { - "id": "f7f76add-411b-420d-9be1-bd120ed99918", - "clientId": "broker", - "name": "${client_broker}", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "redirectUris": [], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - }, - { - "id": "3785434d-2af8-478c-b135-f0b11d1d3205", - "clientId": "pacs", - "rootUrl": "http://127.0.0.1", - "baseUrl": "/pacs-admin", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "66279641-eba6-47f5-9fdb-70c4ac74d548", - "redirectUris": ["*"], - "webOrigins": ["*"], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": true, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": true, - "authorizationServicesEnabled": true, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": { - "saml.assertion.signature": "false", - "saml.force.post.binding": "false", - "saml.multivalued.roles": "false", - "saml.encrypt": "false", - "saml.server.signature": "false", - "saml.server.signature.keyinfo.ext": "false", - "exclude.session.state.from.auth.response": "false", - "saml_force_name_id_format": "false", - "saml.client.signature": "false", - "tls.client.certificate.bound.access.tokens": "false", - "saml.authnstatement": "false", - "display.on.consent.screen": "false", - "saml.onetimeuse.condition": "false" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": true, - "nodeReRegistrationTimeout": -1, - "protocolMappers": [ - { - "id": "6aad2e40-2917-4549-a823-b8765ea4b13f", - "name": "Client IP Address", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "clientAddress", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "clientAddress", - "jsonType.label": "String" - } - }, - { - "id": "560fea50-208a-487a-82ff-de6edd81eb80", - "name": "Client Host", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "clientHost", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "clientHost", - "jsonType.label": "String" - } - }, - { - "id": "248bf04e-057a-46f4-be6c-1a64728e0203", - "name": "Client ID", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "clientId", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "clientId", - "jsonType.label": "String" - } - } - ], - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"], - "authorizationSettings": { - "allowRemoteResourceManagement": true, - "policyEnforcementMode": "ENFORCING", - "resources": [ - { - "name": "Default Resource", - "type": "urn:pacs:resources:default", - "ownerManagedAccess": false, - "attributes": {}, - "_id": "0ba897de-b178-44e6-8dd6-dec09b066808", - "uris": ["/*"] - } - ], - "policies": [ - { - "id": "4b79719f-ed30-451b-8ad1-7ba516a2b3f2", - "name": "Default Policy", - "description": "A policy that grants access only for users within this realm", - "type": "js", - "logic": "POSITIVE", - "decisionStrategy": "AFFIRMATIVE", - "config": { - "code": "// by default, grants any permission associated with this policy\n$evaluation.grant();\n" - } - }, - { - "id": "4071a9c3-5eec-417f-898e-cb0e7fe11f85", - "name": "Default Permission", - "description": "A permission that applies to the default resource type", - "type": "resource", - "logic": "POSITIVE", - "decisionStrategy": "UNANIMOUS", - "config": { - "defaultResourceType": "urn:pacs:resources:default", - "applyPolicies": "[\"Default Policy\"]" - } - } - ], - "scopes": [] - } - }, - { - "id": "e6bee9db-9634-4cd2-93d3-cdaa1f011dd8", - "clientId": "account", - "name": "${client_account}", - "baseUrl": "/auth/realms/ohif/account", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "defaultRoles": ["view-profile", "manage-account"], - "redirectUris": ["/auth/realms/ohif/account/*"], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": {}, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": false, - "nodeReRegistrationTimeout": 0, - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - }, - { - "id": "53d51818-e1bf-4fc2-aa20-5541f2646f12", - "clientId": "ohif-viewer", - "rootUrl": "http://127.0.0.1", - "adminUrl": "http://127.0.0.1", - "baseUrl": "/", - "surrogateAuthRequired": false, - "enabled": true, - "clientAuthenticatorType": "client-secret", - "secret": "**********", - "redirectUris": ["*"], - "webOrigins": ["http://127.0.0.1"], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": false, - "protocol": "openid-connect", - "attributes": { - "saml.assertion.signature": "false", - "saml.force.post.binding": "false", - "saml.multivalued.roles": "false", - "saml.encrypt": "false", - "login_theme": "ohif", - "saml.server.signature": "false", - "saml.server.signature.keyinfo.ext": "false", - "exclude.session.state.from.auth.response": "false", - "saml_force_name_id_format": "false", - "saml.client.signature": "false", - "tls.client.certificate.bound.access.tokens": "false", - "saml.authnstatement": "false", - "display.on.consent.screen": "false", - "saml.onetimeuse.condition": "false" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": true, - "nodeReRegistrationTimeout": -1, - "defaultClientScopes": ["web-origins", "role_list", "profile", "roles", "email"], - "optionalClientScopes": ["address", "phone", "offline_access", "microprofile-jwt"] - } - ], - "clientScopes": [ - { - "id": "6ae5b114-291d-4265-826a-59d66c7257c4", - "name": "microprofile-jwt", - "description": "Microprofile - JWT built-in scope", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "53f31712-86fe-429a-897f-56f6a68ff04a", - "name": "upn", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "upn", - "jsonType.label": "String" - } - }, - { - "id": "400bbe92-0c89-42a5-9deb-846465f37832", - "name": "groups", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "multivalued": "true", - "user.attribute": "foo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "groups", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "bf928a3a-12bd-4fcc-9c8c-a7302161af9c", - "name": "web-origins", - "description": "OpenID Connect scope for add allowed web origins to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false", - "consent.screen.text": "" - }, - "protocolMappers": [ - { - "id": "47ff8af3-462d-450d-b72e-ed8c280f2df7", - "name": "allowed web origins", - "protocol": "openid-connect", - "protocolMapper": "oidc-allowed-origins-mapper", - "consentRequired": false, - "config": {} - } - ] - }, - { - "id": "3a2f720d-06aa-4a21-bb8b-a2fe8ff740ba", - "name": "roles", - "description": "OpenID Connect scope for add user roles to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "true", - "consent.screen.text": "${rolesScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "f312bcba-a892-4fa1-ab66-a784cb3359f7", - "name": "client roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-client-role-mapper", - "consentRequired": false, - "config": { - "multivalued": "true", - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "resource_access.${client_id}.roles", - "jsonType.label": "String" - } - }, - { - "id": "a9ab2bd5-835d-4f5f-aa07-2845ccd3d361", - "name": "audience resolve", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-resolve-mapper", - "consentRequired": false, - "config": {} - }, - { - "id": "cf2ec6d5-ac10-4d67-9c10-1cf6f83d1ba5", - "name": "realm roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "multivalued": "true", - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "realm_access.roles", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "09747e03-0974-4937-a444-2170c1185842", - "name": "phone", - "description": "OpenID Connect built-in scope: phone", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${phoneScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "6e91d83d-746b-499a-9f1c-76d821f2c51d", - "name": "phone number", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "phoneNumber", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number", - "jsonType.label": "String" - } - }, - { - "id": "b185e72e-0fef-43ed-971b-a8e4c420c8b9", - "name": "phone number verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "phoneNumberVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number_verified", - "jsonType.label": "boolean" - } - } - ] - }, - { - "id": "775a0614-070f-4ee3-9eb5-7dace1a3ee9f", - "name": "address", - "description": "OpenID Connect built-in scope: address", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${addressScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "5e9c8afa-e924-4378-b957-391c204dfa97", - "name": "address", - "protocol": "openid-connect", - "protocolMapper": "oidc-address-mapper", - "consentRequired": false, - "config": { - "user.attribute.formatted": "formatted", - "user.attribute.country": "country", - "user.attribute.postal_code": "postal_code", - "userinfo.token.claim": "true", - "user.attribute.street": "street", - "id.token.claim": "true", - "user.attribute.region": "region", - "access.token.claim": "true", - "user.attribute.locality": "locality" - } - } - ] - }, - { - "id": "7361627f-bb6e-4ddf-ba05-9f2e449fd636", - "name": "email", - "description": "OpenID Connect built-in scope: email", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${emailScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "99f6051f-a4dc-46fc-bc46-8fdb224028cb", - "name": "email verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "emailVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email_verified", - "jsonType.label": "boolean" - } - }, - { - "id": "4401b7fa-7a4a-416e-91dd-bd94835bcd05", - "name": "email", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "email", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "ee4aefa7-398a-4ced-b9fb-f25ad83a1e4e", - "name": "profile", - "description": "OpenID Connect built-in scope: profile", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${profileScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "fddd6ec8-99d1-4654-af68-5a08285845a7", - "name": "nickname", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "nickname", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "nickname", - "jsonType.label": "String" - } - }, - { - "id": "4d70b18c-6ac1-4210-be64-3d975d127eeb", - "name": "username", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "preferred_username", - "jsonType.label": "String" - } - }, - { - "id": "e60ad476-a109-4f6d-8b8f-638ea737d641", - "name": "given name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "firstName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "given_name", - "jsonType.label": "String" - } - }, - { - "id": "1ecac05a-a740-4f49-bdde-66df4b57fdab", - "name": "middle name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "middleName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "middle_name", - "jsonType.label": "String" - } - }, - { - "id": "7adb553b-e335-412d-8633-21b1e68fbf5c", - "name": "zoneinfo", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "zoneinfo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "zoneinfo", - "jsonType.label": "String" - } - }, - { - "id": "b51200b1-ffb2-4222-989d-c78af76318d4", - "name": "family name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "lastName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "family_name", - "jsonType.label": "String" - } - }, - { - "id": "cd73c78e-5e78-422d-8f68-818ef766529d", - "name": "picture", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "picture", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "picture", - "jsonType.label": "String" - } - }, - { - "id": "7242207c-dd96-4932-8914-2f36e2d91689", - "name": "full name", - "protocol": "openid-connect", - "protocolMapper": "oidc-full-name-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "access.token.claim": "true", - "userinfo.token.claim": "true" - } - }, - { - "id": "237dace9-0b8e-4e4c-82c7-b3d588630009", - "name": "website", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "website", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "website", - "jsonType.label": "String" - } - }, - { - "id": "88c56ac7-47a8-45e2-8774-1757b0df8d87", - "name": "updated at", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "updatedAt", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "updated_at", - "jsonType.label": "String" - } - }, - { - "id": "ec68ab29-95cd-476c-a528-fa8d0ca97ae9", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - }, - { - "id": "0245d1ab-f14b-4bb2-97d2-6f0e1bab41fe", - "name": "birthdate", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "birthdate", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "birthdate", - "jsonType.label": "String" - } - }, - { - "id": "0d95b1c0-85d9-4dfa-b269-e07a890b023d", - "name": "profile", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "profile", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "profile", - "jsonType.label": "String" - } - }, - { - "id": "7c391683-f6a1-4cd7-aca9-2f6690f1700d", - "name": "gender", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "userinfo.token.claim": "true", - "user.attribute": "gender", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "gender", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "532b1821-92bf-4ff7-95b6-cba1f2ca3545", - "name": "role_list", - "description": "SAML role list", - "protocol": "saml", - "attributes": { - "consent.screen.text": "${samlRoleListScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "e606a1b0-6772-441e-9799-44ec896ca13d", - "name": "role list", - "protocol": "saml", - "protocolMapper": "saml-role-list-mapper", - "consentRequired": false, - "config": { - "single": "false", - "attribute.nameformat": "Basic", - "attribute.name": "Role" - } - } - ] - }, - { - "id": "28c9327f-b38d-4dd8-81f7-3a5bc95c019f", - "name": "offline_access", - "description": "OpenID Connect built-in scope: offline_access", - "protocol": "openid-connect", - "attributes": { - "consent.screen.text": "${offlineAccessScopeConsentText}", - "display.on.consent.screen": "true" - } - } - ], - "defaultDefaultClientScopes": ["role_list", "profile", "email", "roles", "web-origins"], - "defaultOptionalClientScopes": ["offline_access", "address", "phone", "microprofile-jwt"], - "browserSecurityHeaders": { - "contentSecurityPolicyReportOnly": "", - "xContentTypeOptions": "nosniff", - "xRobotsTag": "none", - "xFrameOptions": "SAMEORIGIN", - "xXSSProtection": "1; mode=block", - "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "strictTransportSecurity": "max-age=31536000; includeSubDomains" - }, - "smtpServer": {}, - "eventsEnabled": false, - "eventsListeners": ["jboss-logging"], - "enabledEventTypes": [], - "adminEventsEnabled": false, - "adminEventsDetailsEnabled": false, - "components": { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ - { - "id": "abc1fcf9-610c-4682-a68c-f2786d19ca2f", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "saml-user-attribute-mapper", - "oidc-usermodel-attribute-mapper", - "oidc-usermodel-property-mapper", - "saml-user-property-mapper", - "oidc-sha256-pairwise-sub-mapper", - "saml-role-list-mapper", - "oidc-full-name-mapper", - "oidc-address-mapper" - ] - } - }, - { - "id": "ce5e7488-00e2-4ce5-99b4-b77ea86a1470", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allow-default-scopes": ["true"] - } - }, - { - "id": "73fcfae3-4890-4c85-becf-f43b29b24db9", - "name": "Max Clients Limit", - "providerId": "max-clients", - "subType": "anonymous", - "subComponents": {}, - "config": { - "max-clients": ["200"] - } - }, - { - "id": "5faf17f3-6b8f-40ed-9bdc-ae74a638a197", - "name": "Full Scope Disabled", - "providerId": "scope", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "fe7ccadb-4534-4944-a245-bd78633144af", - "name": "Consent Required", - "providerId": "consent-required", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "483b67ab-fe56-4ba9-ab65-3b9ac59bf048", - "name": "Trusted Hosts", - "providerId": "trusted-hosts", - "subType": "anonymous", - "subComponents": {}, - "config": { - "host-sending-registration-request-must-match": ["true"], - "client-uris-must-match": ["true"] - } - }, - { - "id": "ebf46274-4329-40c7-8342-7a9c2d3181e5", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "saml-role-list-mapper", - "saml-user-property-mapper", - "oidc-usermodel-property-mapper", - "oidc-usermodel-attribute-mapper", - "oidc-sha256-pairwise-sub-mapper", - "saml-user-attribute-mapper", - "oidc-full-name-mapper", - "oidc-address-mapper" - ] - } - }, - { - "id": "4a34d375-8480-4368-8eb7-516e382e5f28", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allow-default-scopes": ["true"] - } - } - ], - "org.keycloak.keys.KeyProvider": [ - { - "id": "527b473f-81bf-4bc1-8c41-667bcefa7414", - "name": "aes-generated", - "providerId": "aes-generated", - "subComponents": {}, - "config": { - "priority": ["100"] - } - }, - { - "id": "ad0ab7c0-d4e0-470c-a43c-f4c4d71d5f9e", - "name": "rsa-generated", - "providerId": "rsa-generated", - "subComponents": {}, - "config": { - "priority": ["100"] - } - }, - { - "id": "6f1171b4-22eb-4a94-ae64-7c33ed2b8817", - "name": "hmac-generated", - "providerId": "hmac-generated", - "subComponents": {}, - "config": { - "priority": ["100"], - "algorithm": ["HS256"] - } - } - ] - }, - "internationalizationEnabled": false, - "supportedLocales": [], - "authenticationFlows": [ - { - "id": "0131114f-fc73-4b02-aa5e-bbf7502229e2", - "alias": "Handle Existing Account", - "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-confirm-link", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "idp-email-verification", - "requirement": "ALTERNATIVE", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "requirement": "ALTERNATIVE", - "priority": 30, - "flowAlias": "Verify Existing Account by Re-authentication", - "userSetupAllowed": false, - "autheticatorFlow": true - } - ] - }, - { - "id": "0c5dd2e0-f444-4406-a8f7-88248808bc2e", - "alias": "Verify Existing Account by Re-authentication", - "description": "Reauthentication of existing account", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-username-password-form", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "auth-otp-form", - "requirement": "OPTIONAL", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "d212c8b1-e4dc-4e19-8ed1-d564406885af", - "alias": "browser", - "description": "browser based authentication", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "requirement": "ALTERNATIVE", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "auth-spnego", - "requirement": "DISABLED", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "identity-provider-redirector", - "requirement": "ALTERNATIVE", - "priority": 25, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "requirement": "ALTERNATIVE", - "priority": 30, - "flowAlias": "forms", - "userSetupAllowed": false, - "autheticatorFlow": true - } - ] - }, - { - "id": "1d9bc1ff-3b71-4730-ac2c-fae8e1babcdd", - "alias": "clients", - "description": "Base authentication for clients", - "providerId": "client-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "client-secret", - "requirement": "ALTERNATIVE", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "client-jwt", - "requirement": "ALTERNATIVE", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "client-secret-jwt", - "requirement": "ALTERNATIVE", - "priority": 30, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "client-x509", - "requirement": "ALTERNATIVE", - "priority": 40, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "9a4f37bf-d5d8-41e9-ac3e-ed41575b9ec9", - "alias": "direct grant", - "description": "OpenID Connect Resource Owner Grant", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "direct-grant-validate-username", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "direct-grant-validate-password", - "requirement": "REQUIRED", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "direct-grant-validate-otp", - "requirement": "OPTIONAL", - "priority": 30, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "898f145d-bb61-49d2-9304-43f42a482199", - "alias": "docker auth", - "description": "Used by Docker clients to authenticate against the IDP", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "docker-http-basic-authenticator", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "9445cbe0-4307-490e-b996-026391c5064b", - "alias": "first broker login", - "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorConfig": "review profile config", - "authenticator": "idp-review-profile", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticatorConfig": "create unique user config", - "authenticator": "idp-create-user-if-unique", - "requirement": "ALTERNATIVE", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "requirement": "ALTERNATIVE", - "priority": 30, - "flowAlias": "Handle Existing Account", - "userSetupAllowed": false, - "autheticatorFlow": true - } - ] - }, - { - "id": "fcb61660-2e54-4434-be96-ce0b5e5bae13", - "alias": "forms", - "description": "Username, password, otp and other auth forms.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-username-password-form", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "auth-otp-form", - "requirement": "OPTIONAL", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "5af7f92b-06d6-4aa4-861d-edbeb917ad8f", - "alias": "http challenge", - "description": "An authentication flow based on challenge-response HTTP Authentication Schemes", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "no-cookie-redirect", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "basic-auth", - "requirement": "REQUIRED", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "basic-auth-otp", - "requirement": "DISABLED", - "priority": 30, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "auth-spnego", - "requirement": "DISABLED", - "priority": 40, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "3829b8aa-55c8-401a-8684-88c36b74502a", - "alias": "registration", - "description": "registration flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-page-form", - "requirement": "REQUIRED", - "priority": 10, - "flowAlias": "registration form", - "userSetupAllowed": false, - "autheticatorFlow": true - } - ] - }, - { - "id": "618d1456-42bb-4737-aa06-f5bde16480fc", - "alias": "registration form", - "description": "registration form", - "providerId": "form-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-user-creation", - "requirement": "REQUIRED", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "registration-profile-action", - "requirement": "REQUIRED", - "priority": 40, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "registration-password-action", - "requirement": "REQUIRED", - "priority": 50, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "registration-recaptcha-action", - "requirement": "DISABLED", - "priority": 60, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "bdd6828c-026b-4a31-9b20-88c1816c7f08", - "alias": "reset credentials", - "description": "Reset credentials for a user if they forgot their password or something", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "reset-credentials-choose-user", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "reset-credential-email", - "requirement": "REQUIRED", - "priority": 20, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "reset-password", - "requirement": "REQUIRED", - "priority": 30, - "userSetupAllowed": false, - "autheticatorFlow": false - }, - { - "authenticator": "reset-otp", - "requirement": "OPTIONAL", - "priority": 40, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - }, - { - "id": "98ff3c64-bf5e-4101-b218-6dc3b7717f2c", - "alias": "saml ecp", - "description": "SAML ECP Profile Authentication Flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "http-basic-authenticator", - "requirement": "REQUIRED", - "priority": 10, - "userSetupAllowed": false, - "autheticatorFlow": false - } - ] - } - ], - "authenticatorConfig": [ - { - "id": "f0446a79-4b15-4c18-abe7-a316f984ece4", - "alias": "create unique user config", - "config": { - "require.password.update.after.registration": "false" - } - }, - { - "id": "3a38d4a4-dc5b-4020-9a94-64b61ad9c997", - "alias": "review profile config", - "config": { - "update.profile.on.first.login": "missing" - } - } - ], - "requiredActions": [ - { - "alias": "CONFIGURE_TOTP", - "name": "Configure OTP", - "providerId": "CONFIGURE_TOTP", - "enabled": true, - "defaultAction": false, - "priority": 10, - "config": {} - }, - { - "alias": "terms_and_conditions", - "name": "Terms and Conditions", - "providerId": "terms_and_conditions", - "enabled": false, - "defaultAction": false, - "priority": 20, - "config": {} - }, - { - "alias": "UPDATE_PASSWORD", - "name": "Update Password", - "providerId": "UPDATE_PASSWORD", - "enabled": true, - "defaultAction": false, - "priority": 30, - "config": {} - }, - { - "alias": "UPDATE_PROFILE", - "name": "Update Profile", - "providerId": "UPDATE_PROFILE", - "enabled": true, - "defaultAction": false, - "priority": 40, - "config": {} - }, - { - "alias": "VERIFY_EMAIL", - "name": "Verify Email", - "providerId": "VERIFY_EMAIL", - "enabled": true, - "defaultAction": false, - "priority": 50, - "config": {} - } - ], - "browserFlow": "browser", - "registrationFlow": "registration", - "directGrantFlow": "direct grant", - "resetCredentialsFlow": "reset credentials", - "clientAuthenticationFlow": "clients", - "dockerAuthenticationFlow": "docker auth", - "attributes": { - "_browser_header.xXSSProtection": "1; mode=block", - "_browser_header.xFrameOptions": "SAMEORIGIN", - "_browser_header.strictTransportSecurity": "max-age=31536000; includeSubDomains", - "permanentLockout": "false", - "quickLoginCheckMilliSeconds": "1000", - "displayName": "OHIF", - "_browser_header.xRobotsTag": "none", - "maxFailureWaitSeconds": "900", - "minimumQuickLoginWaitSeconds": "60", - "displayNameHtml": "
OHIF
", - "failureFactor": "30", - "actionTokenGeneratedByUserLifespan": "300", - "maxDeltaTimeSeconds": "43200", - "_browser_header.xContentTypeOptions": "nosniff", - "offlineSessionMaxLifespan": "5184000", - "actionTokenGeneratedByAdminLifespan": "43200", - "_browser_header.contentSecurityPolicyReportOnly": "", - "bruteForceProtected": "false", - "_browser_header.contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "waitIncrementSeconds": "60", - "offlineSessionMaxLifespanEnabled": "false" - }, - "keycloakVersion": "6.0.1", - "userManagedAccessAllowed": false -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/orthanc.json b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/orthanc.json deleted file mode 100644 index 2e10723c0..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/config/orthanc.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "Name": "Orthanc inside Docker", - "StorageDirectory": "/var/lib/orthanc/db", - "IndexDirectory": "/var/lib/orthanc/db", - "StorageCompression": false, - "MaximumStorageSize": 0, - "MaximumPatientCount": 0, - "LuaScripts": [], - "Plugins": ["/usr/share/orthanc/plugins", "/usr/local/share/orthanc/plugins"], - "ConcurrentJobs": 2, - "HttpServerEnabled": true, - "HttpPort": 8042, - "HttpDescribeErrors": true, - "HttpCompressionEnabled": true, - "DicomServerEnabled": true, - "DicomAet": "ORTHANC", - "DicomCheckCalledAet": false, - "DicomPort": 4242, - "DefaultEncoding": "Latin1", - "DeflatedTransferSyntaxAccepted": true, - "JpegTransferSyntaxAccepted": true, - "Jpeg2000TransferSyntaxAccepted": true, - "JpegLosslessTransferSyntaxAccepted": true, - "JpipTransferSyntaxAccepted": true, - "Mpeg2TransferSyntaxAccepted": true, - "RleTransferSyntaxAccepted": true, - "UnknownSopClassAccepted": false, - "DicomScpTimeout": 30, - - "RemoteAccessAllowed": true, - "SslEnabled": false, - "SslCertificate": "certificate.pem", - "AuthenticationEnabled": false, - "RegisteredUsers": { - "test": "test" - }, - "DicomModalities": {}, - "DicomModalitiesInDatabase": false, - "DicomAlwaysAllowEcho": true, - "DicomAlwaysAllowStore": true, - "DicomCheckModalityHost": false, - "DicomScuTimeout": 10, - "OrthancPeers": {}, - "OrthancPeersInDatabase": false, - "HttpProxy": "", - - "HttpVerbose": true, - - "HttpTimeout": 10, - "HttpsVerifyPeers": true, - "HttpsCACertificates": "", - "UserMetadata": {}, - "UserContentType": {}, - "StableAge": 60, - "StrictAetComparison": false, - "StoreMD5ForAttachments": true, - "LimitFindResults": 0, - "LimitFindInstances": 0, - "LimitJobs": 10, - "LogExportedResources": false, - "KeepAlive": true, - "TcpNoDelay": true, - "HttpThreadsCount": 50, - "StoreDicom": true, - "DicomAssociationCloseDelay": 5, - "QueryRetrieveSize": 10, - "CaseSensitivePN": false, - "LoadPrivateDictionary": true, - "Dictionary": {}, - "SynchronousCMove": true, - "JobsHistorySize": 10, - "SaveJobs": true, - "OverwriteInstances": false, - "MediaArchiveSize": 1, - "StorageAccessOnFind": "Always", - "MetricsEnabled": true, - - "DicomWeb": { - "Enable": true, - "Root": "/dicom-web/", - "EnableWado": true, - "WadoRoot": "/wado", - "Host": "127.0.0.1", - "Ssl": false, - "StowMaxInstances": 10, - "StowMaxSize": 10, - "QidoCaseSensitive": false - } -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/docker-compose.yml b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/docker-compose.yml deleted file mode 100644 index 2a812bfd5..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/docker-compose.yml +++ /dev/null @@ -1,95 +0,0 @@ -# Reference: -# - https://docs.docker.com/compose/compose-file -# - https://eclipsesource.com/blogs/2018/01/11/authenticating-reverse-proxy-with-keycloak/ - -version: '3.5' - -services: - # Exposed server that's handling incoming web requests - # Underlying image: openresty/openresty:alpine-fat - ohif_viewer: - build: - # Project root - context: ./../../../../ - # Relative to context - dockerfile: ./platform/app/.recipes/OpenResty-Orthanc-Keycloak/dockerfile - image: webapp:latest - container_name: webapp - volumes: - # Nginx config - - ./config/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro - # Logs - - ./logs/nginx:/var/logs/nginx - # Let's Encrypt - # - letsencrypt_certificates:/etc/letsencrypt - # - letsencrypt_challenges:/var/www/letsencrypt - ports: - - '443:443' # SSL - - '80:80' # Web - depends_on: - - keycloak - - orthanc - restart: on-failure - - # LINK: https://hub.docker.com/r/jodogne/orthanc-plugins/ - # TODO: Update to use Postgres - # https://github.com/mrts/docker-postgresql-multiple-databases - orthanc: - image: jodogne/orthanc-plugins - hostname: orthanc - container_name: orthanc - volumes: - # Config - - ./config/orthanc.json:/etc/orthanc/orthanc.json:ro - # Persist data - - ./volumes/orthanc-db/:/var/lib/orthanc/db/ - restart: unless-stopped - - # LINK: https://hub.docker.com/r/jboss/keycloak - keycloak: - image: quay.io/keycloak/keycloak:6.0.0 - hostname: keycloak - container_name: keycloak - volumes: - # Theme: https://www.keycloak.org/docs/latest/server_development/index.html#_themes - - ./volumes/keycloak-themes/ohif:/opt/jboss/keycloak/themes/ohif - # Previous Realm Config - - ./config/ohif-keycloak-realm.json:/tmp/ohif-keycloak-realm.json - environment: - # Database - DB_VENDOR: postgres - DB_ADDR: postgres - DB_PORT: 5432 - DB_DATABASE: keycloak - DB_SCHEMA: public - DB_USER: keycloak - DB_PASSWORD: password - # Keycloak - KEYCLOAK_USER: admin - KEYCLOAK_PASSWORD: password - KEYCLOAK_IMPORT: /tmp/ohif-keycloak-realm.json - # KEYCLOAK_WELCOME_THEME: - # KEYCLOAK_DEFAULT_THEME: - # KEYCLOAK_HOSTNAME: (recommended in prod) - # KEYCLOAK_LOGLEVEL: DEBUG - PROXY_ADDRESS_FORWARDING: 'true' - depends_on: - - postgres - restart: unless-stopped - - # LINK: https://hub.docker.com/_/postgres/ - postgres: - image: postgres:11.2 - hostname: postgres - container_name: postgres - volumes: - - postgres_data:/var/lib/postgresql/data - environment: - POSTGRES_DB: keycloak - POSTGRES_USER: keycloak - POSTGRES_PASSWORD: password - restart: unless-stopped - -volumes: - postgres_data: - driver: local diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/dockerfile b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/dockerfile deleted file mode 100644 index 6c5e0b873..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/dockerfile +++ /dev/null @@ -1,85 +0,0 @@ -# docker-compose -# -------------- -# This dockerfile is used by the `docker-compose.yml` adjacent file. When -# running `docker compose build`, this dockerfile helps build the "webapp" image. -# All paths are relative to the `context`, which is the project root directory. -# -# docker build -# -------------- -# If you would like to use this dockerfile to build and tag an image, make sure -# you set the context to the project's root directory: -# https://docs.docker.com/engine/reference/commandline/build/ -# -# -# SUMMARY -# -------------- -# This dockerfile has two stages: -# -# 1. Building the React application for production -# 2. Setting up our Nginx (OpenResty*) image w/ step one's output -# -# * OpenResty is functionally identical to Nginx with the addition of Lua out of -# the box. - - -# Stage 1: Build the application -FROM node:18.16.1-slim as builder - -RUN mkdir /usr/src/app -WORKDIR /usr/src/app - -RUN apt-get update && apt-get install -y build-essential python3 - -ENV APP_CONFIG=config/docker_openresty-orthanc-keycloak.js -ENV PATH /usr/src/app/node_modules/.bin:$PATH - -# Copy all files from the root of the OHIF source and note -# that the Docker ignore file at the root (i.e. ./dockerignore) will filter -# out files and directories that are not needed. -COPY ./ /usr/src/app/ - -ADD . /usr/src/app/ -RUN yarn config set workspaces-experimental true -RUN yarn install -RUN yarn run build - -# Stage 2: Bundle the built application into a Docker container -# which runs openresty (nginx) using Alpine Linux -# LINK: https://hub.docker.com/r/openresty/openresty -FROM openresty/openresty:1.21.4.2-0-bullseye-fat - -RUN mkdir /var/log/nginx -RUN apt-get update && \ - apt-get install -y openssl libssl-dev git gcc wget unzip make&& \ - apt-get clean - -RUN apt-get install --assume-yes lua5.4 libzmq3-dev lua5.4-dev -RUN cd /tmp && \ - wget http://luarocks.org/releases/luarocks-3.9.2.tar.gz && \ - tar zxpf luarocks-3.9.2.tar.gz && \ - cd luarocks-3.9.2 && \ - ./configure && \ - make && \ - make install - -# !!! -RUN luarocks install lua-resty-http -# RUN luarocks install lua-nginx-module -RUN luarocks install lua-cjson -RUN luarocks install lua-resty-string -RUN luarocks install lua-resty-session -RUN luarocks install lua-resty-jwt -RUN luarocks install lua-resty-openidc - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* - -# -RUN luarocks install lua-resty-http -# !!! -RUN luarocks install lua-resty-auto-ssl - - -# Copy build output to image -COPY --from=builder /usr/src/app/platform/app/dist /var/www/html - -ENTRYPOINT ["/usr/local/openresty/nginx/sbin/nginx", "-g", "daemon off;"] diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/account/.githold b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/account/.githold deleted file mode 100644 index e69de29bb..000000000 diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/admin/.githold b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/admin/.githold deleted file mode 100644 index e69de29bb..000000000 diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/email/.githold b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/email/.githold deleted file mode 100644 index e69de29bb..000000000 diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/css/styles.css b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/css/styles.css deleted file mode 100644 index ed1423365..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/css/styles.css +++ /dev/null @@ -1,196 +0,0 @@ -body { - background-color: #040507; - background-image: url('../img/background.jpg'); - background-size: cover; - background-repeat: no-repeat; - - width: 100vw; - height: 100vh; - overflow: hidden; - - color: #fff; - font-family: sans-serif; - text-shadow: 0px 0px 10px #000; -} - -a { - color: #fff; -} - -div#kc-content { - position: absolute; - top: 20%; - left: 50%; - width: 550px; - margin-left: -180px; -} - -div#kc-form { - float: left; - width: 350px; -} - -div#kc-form label { - display: block; - font-size: 16px; -} - -div#info-area { - position: fixed; - bottom: 0; - left: 0; - margin-top: 40px; - background-color: rgba(0, 0, 0, 0.4); - padding: 20px; - width: 100%; -} - -div#info-area p { - margin-right: 30px; - display: inline; - text-shadow: none; -} - -input[type='text'], -input[type='password'] { - color: #333; - font-size: 18px; - margin-bottom: 20px; - background-color: rgba(256, 256, 256, 0.7); - border: 0px solid rgba(0, 0, 0, 0.2); - box-shadow: inset 0 0 2px 2px rgba(0, 0, 0, 0.15); - padding: 10px; - width: 296px; -} - -input[type='text']:hover, -input[type='password']:hover { - background-color: rgba(256, 256, 256, 0.9); -} - -input[type='submit'] { - border: none; - - background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.1)); - background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.1)); - background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.1)); - background: -o-linear-gradient(top, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.1)); - - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.5); - - color: rgba(0, 0, 0, 0.6); - - font-size: 14px; - font-weight: bold; - - padding: 10px; - margin-top: 20px; - margin-right: 10px; - width: 150px; -} - -input[type='submit']:hover { - background-color: rgba(255, 255, 255, 0.8); -} - -div#kc-form-options div { - display: inline-block; - margin-right: 20px; - font-size: 12px; -} - -div#kc-form-options div label { - font-size: 12px; -} - -div#kc-feedback { - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.5); - position: fixed; - top: 0; - left: 0; - width: 100%; - text-align: center; -} - -div#kc-feedback-wrapper { - padding: 1em; -} - -div.feedback-success { - background-color: rgba(155, 155, 255, 0.1); -} - -div.feedback-warning { - background-color: rgba(255, 175, 0, 0.1); -} - -div.feedback-error { - background-color: rgba(255, 0, 0, 0.1); -} - -div#kc-header { - display: none; -} - -div#kc-registration { - margin-bottom: 20px; -} - -div#social-login { - border-left: 1px solid rgba(255, 255, 255, 0.2); - float: right; - width: 150px; - padding: 20px 0 200px 40px; -} - -div.social-login span { - display: none; -} - -div#kc-social-providers ul { - list-style: none; - margin: 0; - padding: 0; -} - -div#kc-social-providers ul li { - margin-bottom: 20px; -} - -div#kc-social-providers ul li span { - display: inline; - width: 100px; -} - -a.zocial { - border: none; - background: -webkit-linear-gradient( - top, - rgba(255, 255, 255, 0.8), - rgba(255, 255, 255, 0.1) - ) !important; - background: -moz-linear-gradient( - top, - rgba(255, 255, 255, 0.8), - rgba(255, 255, 255, 0.1) - ) !important; - background: -ms-linear-gradient( - top, - rgba(255, 255, 255, 0.8), - rgba(255, 255, 255, 0.1) - ) !important; - background: -o-linear-gradient( - top, - rgba(255, 255, 255, 0.8), - rgba(255, 255, 255, 0.1) - ) !important; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.5); - color: rgba(0, 0, 0, 0.6); - width: 130px; - text-shadow: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - padding-top: 0.2em; - padding-bottom: 0.2em; -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/img/background.jpg b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/img/background.jpg deleted file mode 100644 index 9d4f940bd..000000000 Binary files a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/resources/img/background.jpg and /dev/null differ diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/theme.properties b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/theme.properties deleted file mode 100644 index 512f13be2..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/login/theme.properties +++ /dev/null @@ -1,3 +0,0 @@ -parent=base -import=common/keycloak -styles=lib/zocial/zocial.css css/styles.css diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/welcome/.githold b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/keycloak-themes/ohif/welcome/.githold deleted file mode 100644 index e69de29bb..000000000 diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/orthanc-db/.gitignore b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/orthanc-db/.gitignore deleted file mode 100644 index d6b7ef32c..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc-Keycloak/volumes/orthanc-db/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/nginx.conf b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/nginx.conf deleted file mode 100644 index aff59a130..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/nginx.conf +++ /dev/null @@ -1,137 +0,0 @@ -worker_processes 2; -error_log /var/logs/nginx/mydomain.error.log; -pid /var/run/nginx.pid; -include /usr/share/nginx/modules/*.conf; # See /usr/share/doc/nginx/README.dynamic. - -events { - worker_connections 1024; ## Default: 1024 - use epoll; # http://nginx.org/en/docs/events.html - multi_accept on; # http://nginx.org/en/docs/ngx_core_module.html#multi_accept -} - -# Core Modules Docs: -# http://nginx.org/en/docs/http/ngx_http_core_module.html -http { - include '/usr/local/openresty/nginx/conf/mime.types'; - default_type application/octet-stream; - - keepalive_timeout 65; - keepalive_requests 100000; - tcp_nopush on; - tcp_nodelay on; - - # lua_ settings - # - lua_package_path '/usr/local/openresty/lualib/?.lua;;'; - lua_shared_dict discovery 1m; # cache for discovery metadata documents - lua_shared_dict jwks 1m; # cache for JWKs - # lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; - - variables_hash_max_size 2048; - server_names_hash_bucket_size 128; - server_tokens off; - - resolver 8.8.8.8 valid=30s ipv6=off; - resolver_timeout 11s; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - # Nginx `listener` block - server { - listen [::]:80 default_server; - listen 80; - # listen 443 ssl; - access_log /var/logs/nginx/mydomain.access.log; - - # Domain to protect - server_name 127.0.0.1 localhost; # mydomain.com; - proxy_intercept_errors off; - # ssl_certificate /etc/letsencrypt/live/mydomain.co.uk/fullchain.pem; - # ssl_certificate_key /etc/letsencrypt/live/mydomain.co.uk/privkey.pem; - gzip on; - gzip_types text/css application/javascript application/json image/svg+xml; - gzip_comp_level 9; - etag on; - - # https://github.com/bungle/lua-resty-session/issues/15 - set $session_check_ssi off; - lua_code_cache off; - set $session_secret Eeko7aeb6iu5Wohch9Loo1aitha0ahd1; - set $session_storage cookie; - - server_tokens off; # Hides server version num - - # Reverse Proxy for `orthanc` admin - # - location /pacs-admin/ { - - proxy_http_version 1.1; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - expires 0; - add_header Cache-Control private; - - proxy_pass http://orthanc:8042/; - } - - # Reverse Proxy for `orthanc` APIs (including DICOMWeb) - # - location /pacs/ { - - proxy_http_version 1.1; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - expires 0; - add_header Cache-Control private; - - proxy_pass http://orthanc:8042/; - - # By default, this endpoint is protected by CORS (cross-origin-resource-sharing) - # You can add headers to allow other domains to request this resource. - # See the "Updating CORS Settings" example below - } - - # Do not cache sw.js, required for offline-first updates. - location /sw.js { - add_header Cache-Control "no-cache"; - proxy_cache_bypass $http_pragma; - proxy_cache_revalidate on; - expires off; - access_log off; - } - - # Single Page App - # Try files, fallback to index.html - # - location / { - alias /var/www/html/; - index index.html; - try_files $uri $uri/ /index.html; - add_header Cache-Control "no-store, no-cache, must-revalidate"; - add_header 'Cross-Origin-Opener-Policy' 'same-origin' always; - add_header 'Cross-Origin-Embedder-Policy' 'require-corp' always; - } - - # EXAMPLE: Redirect server error pages to the static page /40x.html - # - # error_page 404 /404.html; - # location = /40x.html { - # } - - # EXAMPLE: Redirect server error pages to the static page /50x.html - # - # error_page 500 502 503 504 /50x.html; - # location = /50x.html { - # } - } -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/orthanc.json b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/orthanc.json deleted file mode 100644 index 2e10723c0..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/config/orthanc.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "Name": "Orthanc inside Docker", - "StorageDirectory": "/var/lib/orthanc/db", - "IndexDirectory": "/var/lib/orthanc/db", - "StorageCompression": false, - "MaximumStorageSize": 0, - "MaximumPatientCount": 0, - "LuaScripts": [], - "Plugins": ["/usr/share/orthanc/plugins", "/usr/local/share/orthanc/plugins"], - "ConcurrentJobs": 2, - "HttpServerEnabled": true, - "HttpPort": 8042, - "HttpDescribeErrors": true, - "HttpCompressionEnabled": true, - "DicomServerEnabled": true, - "DicomAet": "ORTHANC", - "DicomCheckCalledAet": false, - "DicomPort": 4242, - "DefaultEncoding": "Latin1", - "DeflatedTransferSyntaxAccepted": true, - "JpegTransferSyntaxAccepted": true, - "Jpeg2000TransferSyntaxAccepted": true, - "JpegLosslessTransferSyntaxAccepted": true, - "JpipTransferSyntaxAccepted": true, - "Mpeg2TransferSyntaxAccepted": true, - "RleTransferSyntaxAccepted": true, - "UnknownSopClassAccepted": false, - "DicomScpTimeout": 30, - - "RemoteAccessAllowed": true, - "SslEnabled": false, - "SslCertificate": "certificate.pem", - "AuthenticationEnabled": false, - "RegisteredUsers": { - "test": "test" - }, - "DicomModalities": {}, - "DicomModalitiesInDatabase": false, - "DicomAlwaysAllowEcho": true, - "DicomAlwaysAllowStore": true, - "DicomCheckModalityHost": false, - "DicomScuTimeout": 10, - "OrthancPeers": {}, - "OrthancPeersInDatabase": false, - "HttpProxy": "", - - "HttpVerbose": true, - - "HttpTimeout": 10, - "HttpsVerifyPeers": true, - "HttpsCACertificates": "", - "UserMetadata": {}, - "UserContentType": {}, - "StableAge": 60, - "StrictAetComparison": false, - "StoreMD5ForAttachments": true, - "LimitFindResults": 0, - "LimitFindInstances": 0, - "LimitJobs": 10, - "LogExportedResources": false, - "KeepAlive": true, - "TcpNoDelay": true, - "HttpThreadsCount": 50, - "StoreDicom": true, - "DicomAssociationCloseDelay": 5, - "QueryRetrieveSize": 10, - "CaseSensitivePN": false, - "LoadPrivateDictionary": true, - "Dictionary": {}, - "SynchronousCMove": true, - "JobsHistorySize": 10, - "SaveJobs": true, - "OverwriteInstances": false, - "MediaArchiveSize": 1, - "StorageAccessOnFind": "Always", - "MetricsEnabled": true, - - "DicomWeb": { - "Enable": true, - "Root": "/dicom-web/", - "EnableWado": true, - "WadoRoot": "/wado", - "Host": "127.0.0.1", - "Ssl": false, - "StowMaxInstances": 10, - "StowMaxSize": 10, - "QidoCaseSensitive": false - } -} diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/docker-compose.yml b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/docker-compose.yml deleted file mode 100644 index 33cf69e2d..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/docker-compose.yml +++ /dev/null @@ -1,47 +0,0 @@ -# Reference: -# - https://docs.docker.com/compose/compose-file -# - https://eclipsesource.com/blogs/2018/01/11/authenticating-reverse-proxy-with-keycloak/ - -version: '3.5' - -services: - # Exposed server that's handling incoming web requests - # Underlying image: openresty/openresty:alpine-fat - ohif_viewer: - build: - # Project root - context: ./../../../../ - # Relative to context - dockerfile: ./platform/app/.recipes/OpenResty-Orthanc/dockerfile - image: webapp:latest - container_name: webapp - volumes: - # Nginx config - - ./config/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro - # Logs - - ./logs/nginx:/var/logs/nginx - # Let's Encrypt - # - letsencrypt_certificates:/etc/letsencrypt - # - letsencrypt_challenges:/var/www/letsencrypt - ports: - - '443:443' # SSL - - '80:80' # Web - depends_on: - - orthanc - restart: on-failure - - # LINK: https://hub.docker.com/r/jodogne/orthanc-plugins/ - # TODO: Update to use Postgres - # https://github.com/mrts/docker-postgresql-multiple-databases - orthanc: - image: jodogne/orthanc-plugins - hostname: orthanc - container_name: orthanc - volumes: - # Config - - ./config/orthanc.json:/etc/orthanc/orthanc.json:ro - # Persist data - - ./volumes/orthanc-db/:/var/lib/orthanc/db/ - restart: unless-stopped - ports: - - '4242:4242' # DIMSE diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/dockerfile b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/dockerfile deleted file mode 100644 index 53a0087ff..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/dockerfile +++ /dev/null @@ -1,79 +0,0 @@ -# docker-compose -# -------------- -# This dockerfile is used by the `docker-compose.yml` adjacent file. When -# running `docker compose build`, this dockerfile helps build the "webapp" image. -# All paths are relative to the `context`, which is the project root directory. -# -# docker build -# -------------- -# If you would like to use this dockerfile to build and tag an image, make sure -# you set the context to the project's root directory: -# https://docs.docker.com/engine/reference/commandline/build/ -# -# -# SUMMARY -# -------------- -# This dockerfile has two stages: -# -# 1. Building the React application for production -# 2. Setting up our Nginx (OpenResty*) image w/ step one's output -# -# * OpenResty is functionally identical to Nginx with the addition of Lua out of -# the box. - - -# Stage 1: Build the application -FROM node:18.16.1-slim as builder - -RUN mkdir /usr/src/app -WORKDIR /usr/src/app - -# Copy all files from the root of the OHIF source and note -# that the Docker ignore file at the root (i.e. ./dockerignore) will filter -# out files and directories that are not needed. -COPY ./ /usr/src/app/ - -# For arm builds since parcel doesn't have prebuilt binaries for arm yet -RUN apt-get update && apt-get install -y build-essential python3 - - -# ADD . /usr/src/app/ -RUN yarn config set workspaces-experimental true -RUN yarn install - -ENV APP_CONFIG=config/docker_openresty-orthanc.js -ENV PATH /usr/src/app/node_modules/.bin:$PATH - -ENV QUICK_BUILD true -RUN yarn run build - -# ADD . /usr/src/app/ -# RUN yarn install -# RUN yarn run build:web - - -# Stage 2: Bundle the built application into a Docker container -# which runs openresty (nginx) using Alpine Linux -# LINK: https://hub.docker.com/r/openresty/openresty -FROM openresty/openresty:1.15.8.1rc1-0-alpine-fat - -RUN mkdir /var/log/nginx -RUN apk add --no-cache openssl -RUN apk add --no-cache openssl-dev -RUN apk add --no-cache git -RUN apk add --no-cache gcc -# !!! -RUN luarocks install lua-resty-openidc - -# -RUN luarocks install lua-resty-jwt -RUN luarocks install lua-resty-session -RUN luarocks install lua-resty-http -# !!! -RUN luarocks install lua-resty-openidc -RUN luarocks install luacrypto - -# Copy build output to image -COPY --from=builder /usr/src/app/platform/app/dist /var/www/html - -ENTRYPOINT ["/usr/local/openresty/nginx/sbin/nginx", "-g", "daemon off;"] diff --git a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/volumes/orthanc-db/.gitignore b/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/volumes/orthanc-db/.gitignore deleted file mode 100644 index d6b7ef32c..000000000 --- a/platform/app/.recipes/deprecated-recipes/OpenResty-Orthanc/volumes/orthanc-db/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/platform/docs/docs/conformance.md b/platform/docs/docs/conformance.md index d0ca8ba00..ac34b46de 100644 --- a/platform/docs/docs/conformance.md +++ b/platform/docs/docs/conformance.md @@ -1,6 +1,6 @@ --- sidebar_position: 12 -sidebar_label: DICOM Conformance Statement (NEW) +sidebar_label: DICOM Conformance Statement title: DICOM Conformance Statement --- diff --git a/platform/docs/docs/migration-guide/3p8-to-3p9/0-general.md b/platform/docs/docs/migration-guide/3p8-to-3p9/0-general.md index 8a96e70e2..45701fc7a 100644 --- a/platform/docs/docs/migration-guide/3p8-to-3p9/0-general.md +++ b/platform/docs/docs/migration-guide/3p8-to-3p9/0-general.md @@ -6,7 +6,7 @@ title: General import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Not SharedArrayBuffer anymore! +# No SharedArrayBuffer anymore! We have streamlined the process of loading volumes without sacrificing speed by eliminating the need for shared array buffers. This change resolves issues across various frameworks, where previously, specific security headers were required. Now, you can remove any previously set headers, which lowers the barrier for adopting Cornerstone 3D in frameworks that didn't support those headers. Shared array buffers are no longer necessary, and all related headers can be removed. diff --git a/platform/docs/docs/migration-guide/3p8-to-3p9/1-segmentation/index.md b/platform/docs/docs/migration-guide/3p8-to-3p9/1-segmentation/index.md index 0eea04b41..f4a7a6744 100644 --- a/platform/docs/docs/migration-guide/3p8-to-3p9/1-segmentation/index.md +++ b/platform/docs/docs/migration-guide/3p8-to-3p9/1-segmentation/index.md @@ -4,8 +4,14 @@ title: Segmentation sidebar_position: 1 --- +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + :::info This migration involves significant architectural changes to the segmentation system. While we typically aim for incremental updates, the shift from a tool group-centric to a viewport-centric architecture was necessary to support OHIF 3.9's advanced visualization capabilities, and more flexible segmentation handling. Don't worry - we'll guide you through each change step by step! ::: + + + diff --git a/platform/docs/docs/migration-guide/3p8-to-3p9/index.md b/platform/docs/docs/migration-guide/3p8-to-3p9/index.md index 56e414e87..c11dcdf8a 100644 --- a/platform/docs/docs/migration-guide/3p8-to-3p9/index.md +++ b/platform/docs/docs/migration-guide/3p8-to-3p9/index.md @@ -4,4 +4,10 @@ title: 3.8 -> 3.9 sidebar_position: 1 --- -Here are the changes you need to make to migrate from 3.8 to 3.9. + +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + +## Migration Guide Sections + + diff --git a/platform/docs/docusaurus.config.js b/platform/docs/docusaurus.config.js index 7804034ac..c1d01daf5 100644 --- a/platform/docs/docusaurus.config.js +++ b/platform/docs/docusaurus.config.js @@ -193,6 +193,12 @@ module.exports = { label: 'Help', position: 'left', }, + { + to: '/migration-guide/3p8-to-3p9/', + //activeBaseRegex: '(^/help$)|(/help)', + label: '3.9 Migration Guides', + position: 'left', + }, { type: 'docsVersionDropdown', position: 'right', diff --git a/platform/docs/src/css/custom.css b/platform/docs/src/css/custom.css index 0d4fde568..1d2a96570 100644 --- a/platform/docs/src/css/custom.css +++ b/platform/docs/src/css/custom.css @@ -34,6 +34,9 @@ --chart-4: 280 65% 60%; --chart-5: 340 75% 55%; --radius: 0.5rem; + --badge-new-color: hsl(var(--primary-foreground)); + --badge-new-background: linear-gradient(135deg, hsl(var(--highlight)), hsl(var(--primary))); + --badge-latest-stable-color: hsl(var(--primary)); } .dark { @@ -61,6 +64,9 @@ --chart-3: 30 80% 55%; --chart-4: 280 65% 60%; --chart-5: 340 75% 55%; + --badge-new-color: hsl(var(--primary-foreground)); + --badge-new-background: linear-gradient(135deg, hsl(var(--highlight)), hsl(var(--primary))); + --badge-latest-stable-color: hsl(var(--primary)); } } @@ -670,3 +676,42 @@ html[data-theme='dark'] .markdown hr { .theme-doc-version-banner { display: none; } + +/* New badge styling */ +/* New Badge Styling */ +a.navbar__item.navbar__link.navbar__link--active[href='/migration-guide/3p8-to-3p9/'][aria-current='page']::after { + content: ' NEW'; + display: inline-block; + margin-left: 8px; + padding: 2px 6px; + font-size: 0.75em; + font-weight: bold; + color: var(--badge-new-color); + background: var(--badge-new-background); + border-radius: 12px; + position: relative; + overflow: hidden; + white-space: nowrap; + /* Shiny Effect */ + background-size: 200% 200%; + animation: shine 2s linear infinite; + box-shadow: 0 0 5px rgba(255, 255, 255, 0.5); +} + +/* Shiny Animation */ +@keyframes shine { + 0% { + background-position: 0% 50%; + } + 100% { + background-position: 100% 50%; + } +} + +/* "(latest stable)" Text Styling */ +a.dropdown__link[href='/3.9/migration-guide/3p8-to-3p9/']::after { + content: ' (latest stable)'; + color: var(--badge-latest-stable-color); + font-size: 0.9em; + margin-left: 4px; +} diff --git a/platform/docs/versioned_docs/version-3.9/migration-guide/3p8-to-3p9/0-general.md b/platform/docs/versioned_docs/version-3.9/migration-guide/3p8-to-3p9/0-general.md index 8a96e70e2..45701fc7a 100644 --- a/platform/docs/versioned_docs/version-3.9/migration-guide/3p8-to-3p9/0-general.md +++ b/platform/docs/versioned_docs/version-3.9/migration-guide/3p8-to-3p9/0-general.md @@ -6,7 +6,7 @@ title: General import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Not SharedArrayBuffer anymore! +# No SharedArrayBuffer anymore! We have streamlined the process of loading volumes without sacrificing speed by eliminating the need for shared array buffers. This change resolves issues across various frameworks, where previously, specific security headers were required. Now, you can remove any previously set headers, which lowers the barrier for adopting Cornerstone 3D in frameworks that didn't support those headers. Shared array buffers are no longer necessary, and all related headers can be removed.