Update deps and Zammad version (6.4.1)

This commit is contained in:
Darren Clarke 2025-01-15 14:15:02 +01:00
parent 07ee819520
commit 9e5ea2fc41
40 changed files with 973 additions and 849 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-frontend", "name": "@link-stack/bridge-frontend",
"version": "2.3.4", "version": "2.4.0b1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@ -17,10 +17,10 @@
"@mui/icons-material": "^6", "@mui/icons-material": "^6",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/material-nextjs": "^6", "@mui/material-nextjs": "^6",
"@mui/x-license": "^7.23.2", "@mui/x-license": "^7.23.6",
"@link-stack/bridge-common": "*", "@link-stack/bridge-common": "*",
"@link-stack/bridge-ui": "*", "@link-stack/bridge-ui": "*",
"next": "15.1.0", "next": "15.1.4",
"next-auth": "^4.24.11", "next-auth": "^4.24.11",
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0", "react-dom": "19.0.0",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-migrations", "name": "@link-stack/bridge-migrations",
"version": "2.3.4", "version": "2.4.0b1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"migrate:up:all": "tsx migrate.ts up:all", "migrate:up:all": "tsx migrate.ts up:all",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-whatsapp", "name": "@link-stack/bridge-whatsapp",
"version": "2.3.4", "version": "2.4.0b1",
"main": "build/main/index.js", "main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
@ -11,16 +11,16 @@
"@hapipal/toys": "^4.0.0", "@hapipal/toys": "^4.0.0",
"@whiskeysockets/baileys": "^6.7.9", "@whiskeysockets/baileys": "^6.7.9",
"hapi-pino": "^12.1.0", "hapi-pino": "^12.1.0",
"link-preview-js": "^3.0.12" "link-preview-js": "^3.0.13"
}, },
"devDependencies": { "devDependencies": {
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@link-stack/jest-config": "*", "@link-stack/jest-config": "*",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"@types/node": "*", "@types/node": "*",
"dotenv-cli": "^7.4.4", "dotenv-cli": "^8.0.0",
"tsx": "^4.19.2", "tsx": "^4.19.2",
"typescript": "^5.7.2" "typescript": "^5.7.3"
}, },
"scripts": { "scripts": {
"build": "tsc -p tsconfig.json", "build": "tsc -p tsconfig.json",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-worker", "name": "@link-stack/bridge-worker",
"version": "2.3.4", "version": "2.4.0b1",
"type": "module", "type": "module",
"main": "build/main/index.js", "main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",
@ -16,14 +16,14 @@
"@link-stack/signal-api": "*", "@link-stack/signal-api": "*",
"fluent-ffmpeg": "^2.1.3", "fluent-ffmpeg": "^2.1.3",
"graphile-worker": "^0.16.6", "graphile-worker": "^0.16.6",
"remeda": "^2.17.4", "remeda": "^2.19.1",
"twilio": "^5.4.0" "twilio": "^5.4.2"
}, },
"devDependencies": { "devDependencies": {
"@types/fluent-ffmpeg": "^2.1.27", "@types/fluent-ffmpeg": "^2.1.27",
"dotenv-cli": "^7.4.4", "dotenv-cli": "^8.0.0",
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"typescript": "^5.7.2" "typescript": "^5.7.3"
} }
} }

View file

@ -22,9 +22,9 @@ const getVisualization = async (visualizationID: string) => {
); );
const hit = hits[0]; const hit = hits[0];
const visualization = { const visualization = {
id: hit._id.split(":")[1], id: hit?._id.split(":")[1],
title: hit._source.visualization.title, title: hit?._source?.visualization.title,
description: hit._source.visualization.description, description: hit?._source?.visualization.description,
url: `/app/visualize?security_tenant=global#/edit/${ url: `/app/visualize?security_tenant=global#/edit/${
hit._id.split(":")[1] hit._id.split(":")[1]
}?embed=true`, }?embed=true`,

View file

@ -10,27 +10,29 @@ const userMetadataIndexName = "user_metadata";
const baseURL = `https://${process.env.OPENSEARCH_USERNAME}:${process.env.OPENSEARCH_PASSWORD}@${process.env.OPENSEARCH_URL}`; const baseURL = `https://${process.env.OPENSEARCH_USERNAME}:${process.env.OPENSEARCH_PASSWORD}@${process.env.OPENSEARCH_URL}`;
const createClient = () => new Client({ const createClient = () =>
node: baseURL, new Client({
auth: { node: baseURL,
username: process.env.OPENSEARCH_USERNAME!, auth: {
password: process.env.OPENSEARCH_PASSWORD!, username: process.env.OPENSEARCH_USERNAME!,
}, password: process.env.OPENSEARCH_PASSWORD!,
ssl: { },
rejectUnauthorized: false, ssl: {
}, rejectUnauthorized: false,
}); },
});
const createUserClient = (username: string, password: string) => new Client({ const createUserClient = (username: string, password: string) =>
node: baseURL, new Client({
auth: { node: baseURL,
username, auth: {
password, username,
}, password,
ssl: { },
rejectUnauthorized: false, ssl: {
}, rejectUnauthorized: false,
}); },
});
export const checkAuth = async (username: string, password: string) => { export const checkAuth = async (username: string, password: string) => {
const client = createUserClient(username, password); const client = createUserClient(username, password);
@ -115,7 +117,7 @@ export const getUserMetadata = async (username: string) => {
await client.create({ await client.create({
id: username, id: username,
index: userMetadataIndexName, index: userMetadataIndexName,
body: { username, savedSearches: [] } body: { username, savedSearches: [] },
}); });
res = await client.get({ res = await client.get({
@ -132,7 +134,7 @@ export const saveUserMetadata = async (username: string, metadata: any) => {
await client.update({ await client.update({
id: username, id: username,
index: userMetadataIndexName, index: userMetadataIndexName,
body: { doc: { username, ...metadata } } body: { doc: { username, ...metadata } },
}); });
}; };
@ -181,7 +183,7 @@ const getIndexPattern: any = async (index: string) => {
sort: ["updated_at:desc"], sort: ["updated_at:desc"],
}); });
if (res.body.hits.total.value === 0) { if (res?.body?.hits?.total?.valueOf() === 0) {
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
return createCurrentUserIndexPattern(index); return createCurrentUserIndexPattern(index);
} }
@ -226,7 +228,7 @@ interface createUserVisualizationProps {
} }
export const createUserVisualization = async ( export const createUserVisualization = async (
props: createUserVisualizationProps props: createUserVisualizationProps,
) => { ) => {
const { email, query, visualizationID, title, description } = props; const { email, query, visualizationID, title, description } = props;
const userIndex = await getCurrentUserIndex(email); const userIndex = await getCurrentUserIndex(email);
@ -279,7 +281,7 @@ interface updateVisualizationProps {
} }
export const updateUserVisualization = async ( export const updateUserVisualization = async (
props: updateVisualizationProps props: updateVisualizationProps,
) => { ) => {
const { email, id, query, title, description } = props; const { email, id, query, title, description } = props;
const userIndex = await getCurrentUserIndex(email); const userIndex = await getCurrentUserIndex(email);
@ -469,10 +471,18 @@ export const performQuery = async (searchQuery: any, limit: number) => {
const results = hits.map((hit: any) => ({ const results = hits.map((hit: any) => ({
...hit._source, ...hit._source,
id: hit._id, id: hit._id,
incident: Array.isArray(hit._source.incident) ? hit._source.incident.join(", ") : hit._source.incident, incident: Array.isArray(hit._source.incident)
technology: Array.isArray(hit._source.technology) ? hit._source.technology.join(", ") : hit._source.technology, ? hit._source.incident.join(", ")
targeted_group: Array.isArray(hit._source.targeted_group) ? hit._source.targeted_group.join(", ") : hit._source.targeted_group, : hit._source.incident,
country: Array.isArray(hit._source.country) ? hit._source.country.join(", ") : hit._source.country, technology: Array.isArray(hit._source.technology)
? hit._source.technology.join(", ")
: hit._source.technology,
targeted_group: Array.isArray(hit._source.targeted_group)
? hit._source.targeted_group.join(", ")
: hit._source.targeted_group,
country: Array.isArray(hit._source.country)
? hit._source.country.join(", ")
: hit._source.country,
})); }));
return results; return results;
@ -570,7 +580,6 @@ export const getTemplates = async (limit: number) => {
}, },
}; };
const rawResponse = await client.search({ const rawResponse = await client.search({
index: globalIndex, index: globalIndex,
size: limit, size: limit,

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/leafcutter", "name": "@link-stack/leafcutter",
"version": "2.3.4", "version": "2.4.0b1",
"scripts": { "scripts": {
"dev": "next dev -p 3001", "dev": "next dev -p 3001",
"login": "aws sso login --sso-session cdr", "login": "aws sso login --sso-session cdr",
@ -22,12 +22,12 @@
"@mui/icons-material": "^6", "@mui/icons-material": "^6",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/material-nextjs": "^6", "@mui/material-nextjs": "^6",
"@mui/x-date-pickers-pro": "^7.23.2", "@mui/x-date-pickers-pro": "^7.23.6",
"@opensearch-project/opensearch": "^2.13.0", "@opensearch-project/opensearch": "^3.1.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"http-proxy-middleware": "^3.0.3", "http-proxy-middleware": "^3.0.3",
"material-ui-popup-state": "^5.3.1", "material-ui-popup-state": "^5.3.3",
"next": "15.1.0", "next": "15.1.4",
"next-auth": "^4.24.11", "next-auth": "^4.24.11",
"react": "19.0.0", "react": "19.0.0",
"react-cookie": "^7.2.2", "react-cookie": "^7.2.2",
@ -36,14 +36,14 @@
"react-iframe": "^1.8.5", "react-iframe": "^1.8.5",
"react-polyglot": "^0.7.2", "react-polyglot": "^0.7.2",
"sharp": "^0.33.5", "sharp": "^0.33.5",
"uuid": "^11.0.3" "uuid": "^11.0.5"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/react": "19.0.1", "@types/react": "19.0.7",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"typescript": "5.7.2" "typescript": "5.7.3"
} }
} }

View file

@ -36,6 +36,9 @@ const fetchUser = async (email: string) => {
const getUserRoles = async (email: string) => { const getUserRoles = async (email: string) => {
try { try {
const user = await fetchUser(email); const user = await fetchUser(email);
if (!user) {
return [];
}
const allRoles = await fetchRoles(); const allRoles = await fetchRoles();
const roles = user.role_ids.map((roleID: number) => { const roles = user.role_ids.map((roleID: number) => {
const role = allRoles[roleID]; const role = allRoles[roleID];

View file

@ -14,9 +14,6 @@ const rewriteURL = (
const destinationURL = `${destinationBaseURL}/${path}`; const destinationURL = `${destinationBaseURL}/${path}`;
console.log(`Rewriting ${request.url} to ${destinationURL}`); console.log(`Rewriting ${request.url} to ${destinationURL}`);
const requestHeaders = new Headers(request.headers); const requestHeaders = new Headers(request.headers);
for (const [key, value] of requestHeaders.entries()) {
console.log(`${key}: ${value}`);
}
requestHeaders.delete("x-forwarded-user"); requestHeaders.delete("x-forwarded-user");
requestHeaders.delete("x-forwarded-roles"); requestHeaders.delete("x-forwarded-roles");
@ -46,6 +43,7 @@ const checkRewrites = async (request: NextRequestWithAuth) => {
"/graphql", "/graphql",
"/cable", "/cable",
]; ];
const isSetupMode = process.env.SETUP_MODE === "true";
const { token } = request.nextauth; const { token } = request.nextauth;
const email = token?.email?.toLowerCase() ?? "unknown"; const email = token?.email?.toLowerCase() ?? "unknown";
const roles = (token?.roles as string[]) ?? []; const roles = (token?.roles as string[]) ?? [];
@ -66,7 +64,7 @@ const checkRewrites = async (request: NextRequestWithAuth) => {
} else if (zammadPaths.some((p) => request.nextUrl.pathname.startsWith(p))) { } else if (zammadPaths.some((p) => request.nextUrl.pathname.startsWith(p))) {
return rewriteURL(request, linkBaseURL, zammadURL, headers); return rewriteURL(request, linkBaseURL, zammadURL, headers);
} else if (request.nextUrl.pathname.startsWith("/api/v1")) { } else if (request.nextUrl.pathname.startsWith("/api/v1")) {
if (email && email !== "unknown") { if ((email && email !== "unknown") || isSetupMode) {
return NextResponse.next(); return NextResponse.next();
} else { } else {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/link", "name": "@link-stack/link",
"version": "2.3.4", "version": "2.4.0b1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@ -24,14 +24,14 @@
"@mui/icons-material": "^6", "@mui/icons-material": "^6",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/material-nextjs": "^6", "@mui/material-nextjs": "^6",
"@mui/x-data-grid-pro": "^7.23.2", "@mui/x-data-grid-pro": "^7.23.6",
"@mui/x-date-pickers": "^7.23.2", "@mui/x-date-pickers": "^7.23.6",
"@mui/x-date-pickers-pro": "^7.23.2", "@mui/x-date-pickers-pro": "^7.23.6",
"@mui/x-license": "^7.23.2", "@mui/x-license": "^7.23.6",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"graphql-request": "^7.1.2", "graphql-request": "^7.1.2",
"mui-chips-input": "^4.0.1", "mui-chips-input": "^4.0.1",
"next": "15.1.0", "next": "15.1.4",
"next-auth": "^4.24.11", "next-auth": "^4.24.11",
"react": "19.0.0", "react": "19.0.0",
"react-cookie": "^7.2.2", "react-cookie": "^7.2.2",
@ -42,8 +42,8 @@
}, },
"devDependencies": { "devDependencies": {
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/react": "19.0.1", "@types/react": "19.0.7",
"@types/uuid": "^10.0.0" "@types/uuid": "^10.0.0"
} }
} }

View file

@ -25,6 +25,7 @@ services:
context: ../../ context: ../../
dockerfile: ./apps/bridge-frontend/Dockerfile dockerfile: ./apps/bridge-frontend/Dockerfile
container_name: bridge-frontend container_name: bridge-frontend
image: registry.gitlab.com/digiresilience/link/link-stack/bridge-frontend:${LINK_STACK_VERSION}
restart: ${RESTART} restart: ${RESTART}
ports: ports:
- 8006:3000 - 8006:3000
@ -35,5 +36,6 @@ services:
context: ../../ context: ../../
dockerfile: ./apps/bridge-worker/Dockerfile dockerfile: ./apps/bridge-worker/Dockerfile
container_name: bridge-worker container_name: bridge-worker
image: registry.gitlab.com/digiresilience/link/link-stack/bridge-worker:${LINK_STACK_VERSION}
restart: ${RESTART} restart: ${RESTART}
environment: *common-bridge-variables environment: *common-bridge-variables

View file

@ -1,7 +1,8 @@
services: services:
signal-cli-rest-api: signal-cli-rest-api:
container_name: signal-cli-rest-api
build: ../signal-cli-rest-api
image: registry.gitlab.com/digiresilience/link/link-stack/signal-cli-rest-api:develop image: registry.gitlab.com/digiresilience/link/link-stack/signal-cli-rest-api:develop
platform: linux/amd64
environment: environment:
- MODE=json-rpc - MODE=json-rpc
volumes: volumes:

View file

@ -17,7 +17,6 @@ x-zammad-vars: &common-zammad-variables
services: services:
zammad-init: zammad-init:
platform: linux/x86_64
container_name: zammad-init container_name: zammad-init
command: ["zammad-init"] command: ["zammad-init"]
depends_on: depends_on:
@ -47,7 +46,6 @@ services:
<<: *common-global-variables <<: *common-global-variables
zammad-nginx: zammad-nginx:
platform: linux/x86_64
container_name: zammad-nginx container_name: zammad-nginx
command: ["zammad-nginx"] command: ["zammad-nginx"]
expose: expose:
@ -72,7 +70,6 @@ services:
- zammad-var:/opt/zammad/var:ro - zammad-var:/opt/zammad/var:ro
zammad-railsserver: zammad-railsserver:
platform: linux/x86_64
container_name: zammad-railsserver container_name: zammad-railsserver
command: ["zammad-railsserver"] command: ["zammad-railsserver"]
depends_on: depends_on:
@ -103,7 +100,6 @@ services:
- redis-data:/data - redis-data:/data
zammad-scheduler: zammad-scheduler:
platform: linux/x86_64
container_name: zammad-scheduler container_name: zammad-scheduler
command: ["zammad-scheduler"] command: ["zammad-scheduler"]
depends_on: depends_on:
@ -123,7 +119,6 @@ services:
- zammad-storage:/opt/zammad/storage - zammad-storage:/opt/zammad/storage
zammad-websocket: zammad-websocket:
platform: linux/x86_64
container_name: zammad-websocket container_name: zammad-websocket
command: ["zammad-websocket"] command: ["zammad-websocket"]
depends_on: depends_on:

View file

@ -1 +1 @@
FROM memcached:1.6.31-bookworm FROM memcached:1.6.34-bookworm

View file

@ -1 +1 @@
FROM nginxproxy/nginx-proxy:1.6.1 FROM nginxproxy/nginx-proxy:1.6.4

View file

@ -1 +1 @@
FROM opensearchproject/opensearch-dashboards:2.17.0 FROM opensearchproject/opensearch-dashboards:2.18.0

View file

@ -1,2 +1,2 @@
FROM opensearchproject/opensearch:2.17.0 FROM opensearchproject/opensearch:2.18.0
RUN /usr/share/opensearch/bin/opensearch-plugin install ingest-attachment -b RUN /usr/share/opensearch/bin/opensearch-plugin install ingest-attachment -b

View file

@ -1 +1 @@
FROM redis:7.4.0-bookworm FROM redis:7.4.2-bookworm

View file

@ -17,8 +17,7 @@ const files = {
const finalFiles = files[app] const finalFiles = files[app]
.map((file) => ['-f', `docker/compose/${file}.yml`]).flat(); .map((file) => ['-f', `docker/compose/${file}.yml`]).flat();
const finalCommand = command === "up" ? ["up", "-d"] : [command]; const finalCommand = command === "up" ? ["up", "-d", "--remove-orphans"] : [command];
const dockerCompose = spawn('docker', ['compose', '--env-file', '.env', ...finalFiles, ...finalCommand]); const dockerCompose = spawn('docker', ['compose', '--env-file', '.env', ...finalFiles, ...finalCommand]);
dockerCompose.stdout.on('data', (data) => { dockerCompose.stdout.on('data', (data) => {

View file

@ -1 +1 @@
FROM bbernhard/signal-cli-rest-api:0.89 FROM bbernhard/signal-cli-rest-api:0.90

View file

@ -1,19 +1,25 @@
ARG ZAMMAD_VERSION=6.3.1 ARG ZAMMAD_VERSION=6.4.1
FROM node:22-slim as node FROM node:22-slim AS node
FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} AS builder FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} AS builder
USER root
COPY --from=node /opt /opt COPY --from=node /opt /opt
COPY --from=node /usr/local/bin /usr/local/bin COPY --from=node /usr/local/bin /usr/local/bin
COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/lib /usr/lib
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
RUN npm install -g pnpm
RUN pnpm --version
WORKDIR ${ZAMMAD_DIR} WORKDIR ${ZAMMAD_DIR}
RUN mkdir -p /opt/zammad/contrib/link/addons RUN mkdir -p /opt/zammad/contrib/link/addons
COPY addons contrib/link/addons COPY addons contrib/link/addons
COPY setup.rb contrib/link/setup.rb COPY setup.rb contrib/link/setup.rb
COPY install.rb contrib/link/install.rb COPY install.rb contrib/link/install.rb
USER root
RUN sed -i '/script\/build\/cleanup\.sh/d' contrib/docker/setup.sh RUN sed -i '/script\/build\/cleanup\.sh/d' contrib/docker/setup.sh
RUN sed -i '/touch db\/schema.rb/a ZAMMAD_SAFE_MODE=1 DATABASE_URL=postgresql:\/\/zammad:\/zammad bundle exec rails runner \/opt\/zammad\/contrib\/link\/install.rb' contrib/docker/setup.sh
RUN cat contrib/docker/setup.sh
RUN contrib/docker/setup.sh builder RUN contrib/docker/setup.sh builder
ARG EMBEDDED=false ARG EMBEDDED=false
RUN if [ "$EMBEDDED" = "true" ] ; then sed -i '/proxy_set_header X-Forwarded-User "";/d' ${ZAMMAD_DIR}/contrib/nginx/zammad.conf; fi RUN if [ "$EMBEDDED" = "true" ] ; then sed -i '/proxy_set_header X-Forwarded-User "";/d' ${ZAMMAD_DIR}/contrib/nginx/zammad.conf; fi
@ -22,11 +28,9 @@ RUN sed -i '/^[[:space:]]*# es config/a\
bundle exec rails runner /opt/zammad/contrib/link/setup.rb\n\ bundle exec rails runner /opt/zammad/contrib/link/setup.rb\n\
bundle exec rake zammad:package:migrate\n\ bundle exec rake zammad:package:migrate\n\
' /docker-entrypoint.sh ' /docker-entrypoint.sh
RUN ZAMMAD_SAFE_MODE=1 DATABASE_URL=postgresql://zammad:/zammad bundle exec rails runner /opt/zammad/contrib/link/install.rb
RUN ZAMMAD_SAFE_MODE=1 DATABASE_URL=postgresql://zammad:/zammad bundle exec rake assets:precompile
FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} as runner FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} AS runner
USER ${ZAMMAD_USER} USER zammad
COPY --from=builder --chown=zammad:zammad ${ZAMMAD_DIR} ${ZAMMAD_DIR} COPY --from=builder --chown=zammad:zammad ${ZAMMAD_DIR} ${ZAMMAD_DIR}
COPY --from=builder /usr/local/bundle /usr/local/bundle COPY --from=builder /usr/local/bundle /usr/local/bundle
COPY --from=builder /docker-entrypoint.sh /docker-entrypoint.sh COPY --from=builder /docker-entrypoint.sh /docker-entrypoint.sh

1523
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,13 @@
{ {
"name": "@link-stack", "name": "@link-stack",
"version": "2.3.4", "version": "2.4.0b1",
"description": "Link from the Center for Digital Resilience", "description": "Link from the Center for Digital Resilience",
"scripts": { "scripts": {
"dev": "dotenv -- turbo dev", "dev": "dotenv -- turbo dev",
"build": "dotenv -- turbo build", "build": "dotenv -- turbo build",
"migrate": "dotenv -- npm run migrate --workspace=database", "migrate": "dotenv -- npm run migrate --workspace=database",
"lint": "dotenv turbo lint", "lint": "dotenv turbo lint",
"update-version": "find . -name 'package.json' -exec sed -i -E 's/\"version\": \"[^\"]+\"/\"version\": \"2.3.4\"/' {} +", "update-version": "find . -name 'package.json' -exec sed -i -E 's/\"version\": \"[^\"]+\"/\"version\": \"2.4.0b1\"/' {} +",
"upgrade:setup": "npm i -g npm-check-updates", "upgrade:setup": "npm i -g npm-check-updates",
"upgrade:check": "ncu && ncu -ws", "upgrade:check": "ncu && ncu -ws",
"upgrade": "ncu -u -x eslint -x kysely && ncu -ws -u -x eslint -x kysely && npm i", "upgrade": "ncu -u -x eslint -x kysely && ncu -ws -u -x eslint -x kysely && npm i",
@ -46,7 +46,7 @@
"type": "git", "type": "git",
"url": "git+https://gitlab.com/digiresilience/link/link-stack.git" "url": "git+https://gitlab.com/digiresilience/link/link-stack.git"
}, },
"packageManager": "npm@10.9.2", "packageManager": "npm@11.0.0",
"author": "Darren Clarke", "author": "Darren Clarke",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"devDependencies": { "devDependencies": {
@ -56,7 +56,7 @@
"typescript": "latest", "typescript": "latest",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"@types/react": "^19.0.0" "@types/react": "^19.0.7"
}, },
"overrides": { "overrides": {
"material-ui-popup-state": { "material-ui-popup-state": {

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/bridge-common", "name": "@link-stack/bridge-common",
"version": "2.3.4", "version": "2.4.0b1",
"main": "build/main/index.js", "main": "build/main/index.js",
"type": "module", "type": "module",
"author": "Darren Clarke <darren@redaranj.com>", "author": "Darren Clarke <darren@redaranj.com>",
@ -17,6 +17,6 @@
"devDependencies": { "devDependencies": {
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"typescript": "^5.7.2" "typescript": "^5.7.3"
} }
} }

View file

@ -1,25 +1,25 @@
{ {
"name": "@link-stack/bridge-ui", "name": "@link-stack/bridge-ui",
"version": "2.3.4", "version": "2.4.0b1",
"scripts": { "scripts": {
"build": "tsc -p tsconfig.json" "build": "tsc -p tsconfig.json"
}, },
"dependencies": { "dependencies": {
"@link-stack/bridge-common": "^2.2.0", "@link-stack/bridge-common": "*",
"@link-stack/signal-api": "*", "@link-stack/signal-api": "*",
"@link-stack/ui": "^2.2.0", "@link-stack/ui": "*",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/x-data-grid-pro": "^7.23.2", "@mui/x-data-grid-pro": "^7.23.6",
"kysely": "0.26.1", "kysely": "0.26.1",
"next": "15.1.0", "next": "15.1.4",
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-qr-code": "^2.0.15" "react-qr-code": "^2.0.15"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/react": "19.0.1", "@types/react": "19.0.7",
"@types/react-dom": "^19.0.2", "@types/react-dom": "^19.0.3",
"typescript": "5.7.2" "typescript": "5.7.3"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/eslint-config", "name": "@link-stack/eslint-config",
"version": "2.3.4", "version": "2.4.0b1",
"description": "amigo's eslint config", "description": "amigo's eslint config",
"author": "Abel Luck <abel@guardianproject.info>", "author": "Abel Luck <abel@guardianproject.info>",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
@ -9,17 +9,17 @@
"fmt": "prettier \"profile/**/*.js\" --write" "fmt": "prettier \"profile/**/*.js\" --write"
}, },
"dependencies": { "dependencies": {
"@rushstack/eslint-patch": "^1.10.4", "@rushstack/eslint-patch": "^1.10.5",
"@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/eslint-plugin": "^8.20.0",
"@typescript-eslint/parser": "^8.18.0", "@typescript-eslint/parser": "^8.20.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^10.0.1",
"eslint-config-xo-space": "^0.35.0", "eslint-config-xo-space": "^0.35.0",
"eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jest": "^28.9.0", "eslint-plugin-jest": "^28.11.0",
"eslint-plugin-promise": "^7.2.1", "eslint-plugin-promise": "^7.2.1",
"eslint-plugin-unicorn": "56.0.1", "eslint-plugin-unicorn": "56.0.1",
"@babel/eslint-parser": "7.25.9" "@babel/eslint-parser": "7.26.5"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "^4.9.5" "typescript": "^4.9.5"
@ -27,6 +27,6 @@
"devDependencies": { "devDependencies": {
"eslint": "^8", "eslint": "^8",
"jest": "^29.7.0", "jest": "^29.7.0",
"typescript": "^5.7.2" "typescript": "^5.7.3"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/jest-config", "name": "@link-stack/jest-config",
"version": "2.3.4", "version": "2.4.0b1",
"description": "", "description": "",
"author": "Abel Luck <abel@guardianproject.info>", "author": "Abel Luck <abel@guardianproject.info>",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/leafcutter-ui", "name": "@link-stack/leafcutter-ui",
"version": "2.3.4", "version": "2.4.0b1",
"scripts": { "scripts": {
"build": "tsc -p tsconfig.json" "build": "tsc -p tsconfig.json"
}, },
@ -10,23 +10,23 @@
"@link-stack/opensearch-common": "*", "@link-stack/opensearch-common": "*",
"@mui/icons-material": "^6", "@mui/icons-material": "^6",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/x-data-grid-pro": "^7.23.2", "@mui/x-data-grid-pro": "^7.23.6",
"@mui/x-date-pickers-pro": "^7.23.2", "@mui/x-date-pickers-pro": "^7.23.6",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"next": "15.1.0", "next": "15.1.4",
"next-auth": "^4.24.11", "next-auth": "^4.24.11",
"react": "19.0.0", "react": "19.0.0",
"react-cookie": "^7.2.2", "react-cookie": "^7.2.2",
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-iframe": "^1.8.5", "react-iframe": "^1.8.5",
"react-markdown": "^9.0.1", "react-markdown": "^9.0.3",
"react-polyglot": "^0.7.2" "react-polyglot": "^0.7.2"
}, },
"devDependencies": { "devDependencies": {
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/react": "19.0.1", "@types/react": "19.0.7",
"typescript": "5.7.2" "typescript": "5.7.3"
} }
} }

View file

@ -164,7 +164,7 @@ const getIndexPattern: any = async (index: string) => {
sort: ["updated_at:desc"], sort: ["updated_at:desc"],
}); });
if (res.body.hits.total.value === 0) { if (res?.body?.hits?.total?.valueOf() === 0) {
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
return createCurrentUserIndexPattern(index); return createCurrentUserIndexPattern(index);
} }

View file

@ -1,18 +1,18 @@
{ {
"name": "@link-stack/opensearch-common", "name": "@link-stack/opensearch-common",
"version": "2.3.4", "version": "2.4.0b1",
"scripts": { "scripts": {
"build": "tsc -p tsconfig.json" "build": "tsc -p tsconfig.json"
}, },
"dependencies": { "dependencies": {
"@opensearch-project/opensearch": "^2.13.0", "@opensearch-project/opensearch": "^3.1.0",
"uuid": "^11.0.3" "uuid": "^11.0.5"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@link-stack/typescript-config": "*", "@link-stack/typescript-config": "*",
"@link-stack/eslint-config": "*", "@link-stack/eslint-config": "*",
"typescript": "5.7.2" "typescript": "5.7.3"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/signal-api", "name": "@link-stack/signal-api",
"version": "2.3.4", "version": "2.4.0b1",
"type": "module", "type": "module",
"main": "build/index.js", "main": "build/index.js",
"exports": { "exports": {

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/typescript-config", "name": "@link-stack/typescript-config",
"version": "2.3.4", "version": "2.4.0b1",
"description": "Shared TypeScript config", "description": "Shared TypeScript config",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"author": "Abel Luck <abel@guardianproject.info>", "author": "Abel Luck <abel@guardianproject.info>",

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/ui", "name": "@link-stack/ui",
"version": "2.3.4", "version": "2.4.0b1",
"description": "", "description": "",
"scripts": { "scripts": {
"build": "tsc -p tsconfig.json" "build": "tsc -p tsconfig.json"
@ -9,15 +9,15 @@
"dependencies": { "dependencies": {
"@mui/icons-material": "^6", "@mui/icons-material": "^6",
"@mui/material": "^6", "@mui/material": "^6",
"@mui/x-data-grid-pro": "^7.23.2", "@mui/x-data-grid-pro": "^7.23.6",
"@mui/x-license": "^7.23.2", "@mui/x-license": "^7.23.6",
"next": "15.1.0", "next": "15.1.4",
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0" "react-dom": "19.0.0"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"@types/react": "19.0.1", "@types/react": "19.0.7",
"typescript": "^5.7.2" "typescript": "^5.7.3"
} }
} }

View file

@ -1,7 +1,7 @@
{ {
"name": "@link-stack/zammad-addon-bridge", "name": "@link-stack/zammad-addon-bridge",
"displayName": "Bridge", "displayName": "Bridge",
"version": "2.3.4", "version": "2.4.0b1",
"description": "An addon that adds CDR Bridge channels to Zammad.", "description": "An addon that adds CDR Bridge channels to Zammad.",
"scripts": { "scripts": {
"build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'", "build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'",

View file

@ -10,7 +10,7 @@ class CdrSignalChannel < ActiveRecord::Migration[5.2]
) )
Permission.create_if_not_exists( Permission.create_if_not_exists(
name: 'admin.channel_cdr_signal', name: 'admin.channel_cdr_signal',
note: 'Manage %s', description: 'Manage %s',
preferences: { preferences: {
translations: ['Channel - Signal'] translations: ['Channel - Signal']
} }

View file

@ -10,7 +10,7 @@ class CdrVoiceChannel < ActiveRecord::Migration[5.2]
) )
Permission.create_if_not_exists( Permission.create_if_not_exists(
name: 'admin.channel_cdr_voice', name: 'admin.channel_cdr_voice',
note: 'Manage %s', description: 'Manage %s',
preferences: { preferences: {
translations: ['Channel - Voice'] translations: ['Channel - Voice']
} }

View file

@ -10,7 +10,7 @@ class CdrWhatsappChannel < ActiveRecord::Migration[5.2]
) )
Permission.create_if_not_exists( Permission.create_if_not_exists(
name: 'admin.channel_cdr_whatsapp', name: 'admin.channel_cdr_whatsapp',
note: 'Manage %s', description: 'Manage %s',
preferences: { preferences: {
translations: ['Channel - Whatsapp'] translations: ['Channel - Whatsapp']
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "@link-stack/zammad-addon-common", "name": "@link-stack/zammad-addon-common",
"version": "2.3.4", "version": "2.4.0b1",
"description": "", "description": "",
"bin": { "bin": {
"zpm-build": "./dist/build.js", "zpm-build": "./dist/build.js",
@ -10,12 +10,12 @@
"build": "tsc" "build": "tsc"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.10.2", "@types/node": "^22.10.6",
"typescript": "^5" "typescript": "^5"
}, },
"author": "", "author": "",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"glob": "^11.0.0" "glob": "^11.0.1"
} }
} }

View file

@ -1,7 +1,7 @@
{ {
"name": "@link-stack/zammad-addon-hardening", "name": "@link-stack/zammad-addon-hardening",
"displayName": "Hardening", "displayName": "Hardening",
"version": "2.3.4", "version": "2.4.0b1",
"description": "A Zammad addon that hardens a Zammad instance according to CDR's needs.", "description": "A Zammad addon that hardens a Zammad instance according to CDR's needs.",
"scripts": { "scripts": {
"build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'", "build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'",

View file

@ -1,7 +1,7 @@
{ {
"name": "@link-stack/zammad-addon-leafcutter", "name": "@link-stack/zammad-addon-leafcutter",
"displayName": "Leafcutter", "displayName": "Leafcutter",
"version": "2.3.4", "version": "2.4.0b1",
"description": "Adds a common set of tags for Leafcutter uses.", "description": "Adds a common set of tags for Leafcutter uses.",
"scripts": { "scripts": {
"build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'", "build": "node '../../node_modules/@link-stack/zammad-addon-common/dist/build.js'",