diff --git a/app/constants/network.ts b/app/constants/network.ts index 4fdf7329d..f7168d0dd 100644 --- a/app/constants/network.ts +++ b/app/constants/network.ts @@ -7,6 +7,7 @@ import keyMirror from '@utils/key_mirror'; export const CERTIFICATE_ERRORS = keyMirror({ CLIENT_CERTIFICATE_IMPORT_ERROR: null, CLIENT_CERTIFICATE_MISSING: null, + SERVER_INVALID_CERTIFICATE: null, }); export const DOWNLOAD_TIMEOUT = toMilliseconds({minutes: 10}); diff --git a/app/managers/network_manager.ts b/app/managers/network_manager.ts index 440b2a06e..de265d74f 100644 --- a/app/managers/network_manager.ts +++ b/app/managers/network_manager.ts @@ -9,20 +9,23 @@ import { RetryTypes, type APIClientConfiguration, } from '@mattermost/react-native-network-client'; -import {DeviceEventEmitter} from 'react-native'; +import {Alert, DeviceEventEmitter} from 'react-native'; import DeviceInfo from 'react-native-device-info'; +import urlParse from 'url-parse'; import LocalConfig from '@assets/config.json'; import {Client} from '@client/rest'; import * as ClientConstants from '@client/rest/constants'; import ClientError from '@client/rest/error'; import {CERTIFICATE_ERRORS} from '@constants/network'; +import {DEFAULT_LOCALE, getLocalizedMessage, t} from '@i18n'; import ManagedApp from '@init/managed_app'; -import {logError} from '@utils/log'; +import {logDebug, logError} from '@utils/log'; import {getCSRFFromCookie} from '@utils/security'; const CLIENT_CERTIFICATE_IMPORT_ERROR_CODES = [-103, -104, -105, -108]; const CLIENT_CERTIFICATE_MISSING_ERROR_CODE = -200; +const SERVER_CERTIFICATE_INVALID = -299; class NetworkManager { private clients: Record = {}; @@ -121,6 +124,17 @@ class NetworkManager { DeviceEventEmitter.emit(CERTIFICATE_ERRORS.CLIENT_CERTIFICATE_IMPORT_ERROR, event.serverUrl); } else if (CLIENT_CERTIFICATE_MISSING_ERROR_CODE === event.errorCode) { DeviceEventEmitter.emit(CERTIFICATE_ERRORS.CLIENT_CERTIFICATE_MISSING, event.serverUrl); + } else if (SERVER_CERTIFICATE_INVALID === event.errorCode) { + logDebug('Invalid SSL certificate:', event.errorDescription); + const parsed = urlParse(event.serverUrl); + Alert.alert( + getLocalizedMessage(DEFAULT_LOCALE, t('server.invalid.certificate.title'), 'Invalid SSL certificate'), + getLocalizedMessage( + DEFAULT_LOCALE, + t('server.invalid.certificate.description'), + 'The certificate for this server is invalid.\nYou might be connecting to a server that is pretending to be “{hostname}” which could put your confidential information at risk.', + ).replace('{hostname}', parsed.hostname), + ); } }; } diff --git a/app/screens/server/index.tsx b/app/screens/server/index.tsx index 52cf20d3e..da8944214 100644 --- a/app/screens/server/index.tsx +++ b/app/screens/server/index.tsx @@ -289,6 +289,10 @@ const Server = ({ }; const serverUrl = await getServerUrlAfterRedirect(pingUrl, !retryWithHttp); + if (!serverUrl) { + cancelPing(); + return; + } const result = await doPing(serverUrl, true, managedConfig?.timeout ? parseInt(managedConfig?.timeout, 10) : undefined); if (canceled) { diff --git a/app/utils/url/index.ts b/app/utils/url/index.ts index 57e08dc7a..e9c45a386 100644 --- a/app/utils/url/index.ts +++ b/app/utils/url/index.ts @@ -43,7 +43,9 @@ export async function getServerUrlAfterRedirect(serverUrl: string, useHttp = fal url = resp.redirectUrls[resp.redirectUrls.length - 1]; } } catch (error) { - // do nothing + if (useHttp) { + return undefined; + } } return sanitizeUrl(url, useHttp); diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index 1858946bd..799536bd3 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -681,10 +681,10 @@ "mobile.search.modifier.from": "a specific user", "mobile.search.modifier.in": "a specific channel", "mobile.search.modifier.phrases": "messages with phrases", + "mobile.search.results": "{count} search {count, plural, one {result} other {results}}", "mobile.search.show_less": "Show less", "mobile.search.show_more": "Show more", "mobile.search.team.select": "Select a team to search", - "mobile.search.results": "{count} search {count, plural, one {result} other {results}}", "mobile.server_identifier.exists": "You are already connected to this server.", "mobile.server_link.error.text": "The link could not be found on this server.", "mobile.server_link.error.title": "Link Error", @@ -907,6 +907,8 @@ "server_upgrade.alert_description": "Your server, {serverDisplayName}, is running an unsupported server version. Users will be exposed to compatibility issues that cause crashes or severe bugs breaking core functionality of the app. Upgrading to server version {supportedServerVersion} or later is required.", "server_upgrade.dismiss": "Dismiss", "server_upgrade.learn_more": "Learn More", + "server.invalid.certificate.description": "The certificate for this server is invalid.\nYou might be connecting to a server that is pretending to be “{hostname}” which could put your confidential information at risk.", + "server.invalid.certificate.title": "Invalid SSL certificate", "server.logout.alert_description": "All associated data will be removed", "server.logout.alert_title": "Are you sure you want to log out of {displayName}?", "server.remove.alert_description": "This will remove it from your list of servers. All associated data will be removed", @@ -1071,4 +1073,4 @@ "video.download_description": "This video must be downloaded to play it.", "video.failed_description": "An error occurred while trying to play the video.", "your.servers": "Your servers" -} \ No newline at end of file +} diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e0b6dc2af..26a0b099c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -380,7 +380,7 @@ PODS: - React-Core - react-native-netinfo (9.4.1): - React-Core - - react-native-network-client (1.3.8): + - react-native-network-client (1.4.0): - Alamofire (~> 5.6.4) - React-Core - Starscream (~> 4.0.4) @@ -953,7 +953,7 @@ SPEC CHECKSUMS: react-native-image-picker: 5fcac5a5ffcb3737837f0617d43fd767249290de react-native-in-app-review: db8bb167a5f238e7ceca5c242d6b36ce8c4404a4 react-native-netinfo: fefd4e98d75cbdd6e85fc530f7111a8afdf2b0c5 - react-native-network-client: b12f0de0c3488237a8240e5f2acdd9f6c505c6d5 + react-native-network-client: 38affc5ccc242b6c825171b8f451bfb84468affd react-native-notifications: d309f7080aad71206882dbb98d9ed788969f3b6d react-native-paste-input: 09f14cbfb646ad9d2ef79cdc6f3d45f337c10ad1 react-native-safe-area-context: 9697629f7b2cda43cf52169bb7e0767d330648c2 diff --git a/package-lock.json b/package-lock.json index b8279a3cf..a3ca6d58e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "mattermost-mobile", - "version": "2.7.0", + "version": "2.8.0", "hasInstallScript": true, "license": "Apache 2.0", "dependencies": { @@ -20,7 +20,7 @@ "@mattermost/calls": "github:mattermost/calls-common#v0.17.0", "@mattermost/compass-icons": "0.1.37", "@mattermost/react-native-emm": "1.3.5", - "@mattermost/react-native-network-client": "1.3.8", + "@mattermost/react-native-network-client": "1.4.0", "@mattermost/react-native-paste-input": "0.6.4", "@mattermost/react-native-turbo-log": "0.2.3", "@msgpack/msgpack": "2.8.0", @@ -3450,9 +3450,9 @@ } }, "node_modules/@mattermost/react-native-network-client": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@mattermost/react-native-network-client/-/react-native-network-client-1.3.8.tgz", - "integrity": "sha512-cbrfSV0UCZ7tUSAdskREwi/6eZs/JY/wKauXa7MCIJxUKufVhEQc0sbIkXo9C93a5J8S2YJ8ECgC5l2D+8crjw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@mattermost/react-native-network-client/-/react-native-network-client-1.4.0.tgz", + "integrity": "sha512-PY0Q85l8hQf4KiB54KVQG+LphZsq+oaRjZFpG3u+S43iPvsIf7L8Cz+p8lFlR4Fz/C8bmWxFBX9Y4ZJ6RimVvw==", "dependencies": { "validator": "13.9.0", "zod": "3.21.4" @@ -23600,8 +23600,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": { - } + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -25424,13 +25423,12 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@mattermost/react-native-emm/-/react-native-emm-1.3.5.tgz", "integrity": "sha512-REdUEsm/RA6lI1Rt4b009jvWn28f7H+e27gd4hlNk6zesIh/dlfiHwYfInW/vwbNFBdSPpvHy7Qi2mdcvrNqhg==", - "requires": { - } + "requires": {} }, "@mattermost/react-native-network-client": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@mattermost/react-native-network-client/-/react-native-network-client-1.3.8.tgz", - "integrity": "sha512-cbrfSV0UCZ7tUSAdskREwi/6eZs/JY/wKauXa7MCIJxUKufVhEQc0sbIkXo9C93a5J8S2YJ8ECgC5l2D+8crjw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@mattermost/react-native-network-client/-/react-native-network-client-1.4.0.tgz", + "integrity": "sha512-PY0Q85l8hQf4KiB54KVQG+LphZsq+oaRjZFpG3u+S43iPvsIf7L8Cz+p8lFlR4Fz/C8bmWxFBX9Y4ZJ6RimVvw==", "requires": { "validator": "13.9.0", "zod": "3.21.4" @@ -25448,8 +25446,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@mattermost/react-native-turbo-log/-/react-native-turbo-log-0.2.3.tgz", "integrity": "sha512-usWyD8zVAHzrYqgPH1ne5I14gCOkhS2mefK58g5v4DewZfCm0/Uc0w8MRuPS/9jyOPPq1rUZj8U1AqKgEne9tQ==", - "requires": { - } + "requires": {} }, "@msgpack/msgpack": { "version": "2.8.0", @@ -25541,15 +25538,13 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@react-native-camera-roll/camera-roll/-/camera-roll-5.7.2.tgz", "integrity": "sha512-s8VAUG1Kvi+tEJkLHObmOJdXAL/uclnXJ/IdnJtx2fCKiWA3Ho0ln9gDQqCYHHHHu+sXk7wovsH/I2/AYy0brg==", - "requires": { - } + "requires": {} }, "@react-native-clipboard/clipboard": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.11.2.tgz", "integrity": "sha512-bHyZVW62TuleiZsXNHS1Pv16fWc0fh8O9WvBzl4h2fykqZRW9a+Pv/RGTH56E3X2PqzHP38K5go8zmCZUoIsoQ==", - "requires": { - } + "requires": {} }, "@react-native-community/cli": { "version": "10.2.4", @@ -27258,8 +27253,7 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-9.4.1.tgz", "integrity": "sha512-dAbY5mfw+6Kas/GJ6QX9AZyY+K+eq9ad4Su6utoph/nxyH3whp5cMSgRNgE2VhGQVRZ/OG0qq3IaD3+wzoqJXw==", - "requires": { - } + "requires": {} }, "@react-native-cookies/cookies": { "version": "6.2.1", @@ -27425,8 +27419,7 @@ "version": "1.3.18", "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.18.tgz", "integrity": "sha512-/0hwnJkrr415yP0Hf4PjUKgGyfshrvNUKFXN85Mrt1gY49hy9IwxZgrrxlh0THXkPeq8q4VWw44eHDfAcQf20Q==", - "requires": { - } + "requires": {} }, "@react-navigation/native": { "version": "6.1.7", @@ -27661,72 +27654,63 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/@stream-io/flat-list-mvcp/-/flat-list-mvcp-0.10.3.tgz", "integrity": "sha512-2ZK8piYlEfKIPZrH8BpZz9uj8HZcUvMCV0X7qSLSAc/vhLOANBfR0SSn0OaWPbqb2mFGAd4FxmLSPp1zKEYuaw==", - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.0.0.tgz", "integrity": "sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "dev": true, - "requires": { - } + "requires": {} }, "@svgr/babel-preset": { "version": "8.0.0", @@ -28695,8 +28679,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", "dev": true, - "requires": { - } + "requires": {} }, "@webpack-cli/info": { "version": "1.4.0", @@ -28712,8 +28695,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", "dev": true, - "requires": { - } + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -28768,15 +28750,13 @@ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true, "peer": true, - "requires": { - } + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": { - } + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -28832,8 +28812,7 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peer": true, - "requires": { - } + "requires": {} }, "anser": { "version": "1.4.10", @@ -29116,8 +29095,7 @@ "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "requires": { - } + "requires": {} }, "babel-jest": { "version": "29.6.2", @@ -30318,8 +30296,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, - "requires": { - } + "requires": {} }, "deep-equal": { "version": "2.2.2", @@ -31222,8 +31199,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "requires": { - } + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.7", @@ -31308,8 +31284,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", "dev": true, - "requires": { - } + "requires": {} }, "eslint-plugin-import": { "version": "2.28.0", @@ -31443,8 +31418,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": { - } + "requires": {} }, "eslint-plugin-react-native": { "version": "4.0.0", @@ -33818,8 +33792,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "requires": { - } + "requires": {} }, "jest-regex-util": { "version": "29.4.3", @@ -37047,8 +37020,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz", "integrity": "sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==", - "requires": { - } + "requires": {} }, "react-intl": { "version": "6.4.4", @@ -37356,8 +37328,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/react-native-background-timer/-/react-native-background-timer-2.4.1.tgz", "integrity": "sha512-TE4Kiy7jUyv+hugxDxitzu38sW1NqjCk4uE5IgU2WevLv7sZacaBc6PZKOShNRPGirLl1NWkaG3LDEkdb9Um5g==", - "requires": { - } + "requires": {} }, "react-native-button": { "version": "3.1.0", @@ -37410,15 +37381,13 @@ "version": "1.6.4", "resolved": "https://registry.npmjs.org/react-native-create-thumbnail/-/react-native-create-thumbnail-1.6.4.tgz", "integrity": "sha512-JWuKXswDXtqUPfuqh6rjCVMvTSSG3kUtwvSK/YdaNU0i+nZKxeqHmt/CO2+TyI/WSUFynGVmWT1xOHhCZAFsRQ==", - "requires": { - } + "requires": {} }, "react-native-device-info": { "version": "10.8.0", "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-10.8.0.tgz", "integrity": "sha512-DE4/X82ZVhdcnR1Y21iTP46WSSJA/rHK3lmeqWfGGq1RKLwXTIdxmfbZZnYwryqJ+esrw2l4ND19qlgxDGby8A==", - "requires": { - } + "requires": {} }, "react-native-document-picker": { "version": "9.0.1", @@ -37455,22 +37424,19 @@ "version": "2.10.10", "resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.10.tgz", "integrity": "sha512-otAXGoZDl1689OoUJWN/rXxVbdoZ3xcmyF1uq/CsizdLwwyZqVGd6d+p/vbYvnF996FfEyAEBnHrdFxulTn51w==", - "requires": { - } + "requires": {} }, "react-native-fast-image": { "version": "8.6.3", "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz", "integrity": "sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg==", - "requires": { - } + "requires": {} }, "react-native-file-viewer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz", "integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==", - "requires": { - } + "requires": {} }, "react-native-fs": { "version": "2.20.0", @@ -37509,22 +37475,19 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-2.0.3.tgz", "integrity": "sha512-7+qvcxXZts/hA+HOOIFyM1x9m9fn/TJVSTgXaoQ8uT4gLc97IMvqHQ559tDmnlth+hHMzd3HRMpmRLWoKPL0DA==", - "requires": { - } + "requires": {} }, "react-native-hw-keyboard-event": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/react-native-hw-keyboard-event/-/react-native-hw-keyboard-event-0.0.4.tgz", "integrity": "sha512-G8qp0nm17PHigLb/axgdF9xg51BKCG2p1AGeq//J/luLp5zNczIcQJh+nm02R1MeEUE3e53wqO4LMe0MV3raZg==", - "requires": { - } + "requires": {} }, "react-native-image-picker": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-5.6.1.tgz", "integrity": "sha512-LPPlgJi97EzCDY4NWp7z0oUWmCbagnB6HSoKcLJHJD/DaFYN/dJPrqjqKaqqw8K/5Ze6DIsNg9PZohjNEYQQWQ==", - "requires": { - } + "requires": {} }, "react-native-in-app-review": { "version": "4.3.3", @@ -37535,15 +37498,13 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/react-native-incall-manager/-/react-native-incall-manager-4.1.0.tgz", "integrity": "sha512-v1c+XOGu5VudY5//E3i5xiaRA9v6RvevMzZ4RumLqI+hte+4XslB2z6HSek2FF0EmAnY1rCn4ckiwgkTI1Tmtw==", - "requires": { - } + "requires": {} }, "react-native-iphone-x-helper": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==", - "requires": { - } + "requires": {} }, "react-native-keyboard-aware-scroll-view": { "version": "0.9.5", @@ -37558,8 +37519,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/react-native-keyboard-tracking-view/-/react-native-keyboard-tracking-view-5.7.0.tgz", "integrity": "sha512-MDeEwAbn9LJDOfHq0QLCGaZirVLk2X/tHqkAqz3y6uxryTRdSl9PwleOVar5Jx2oAPEg4J9BXbUD1wwOOi+5Kg==", - "requires": { - } + "requires": {} }, "react-native-keychain": { "version": "8.1.2", @@ -37570,15 +37530,13 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.2.tgz", "integrity": "sha512-hgmCsgzd58WNcDCyPtKrvxsaoETjb/jLGxis/dmU3Aqm2u4ICIduj4ECjbil7B7pm9OnuTkmpwXu08XV2mpg8g==", - "requires": { - } + "requires": {} }, "react-native-localize": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-3.0.2.tgz", "integrity": "sha512-/l/oE1LVNgIRRhLbhmfFMHiWV0xhUn0A0iz1ytLVRYywL7FTp8Rx2vkJS/q/RpExDvV7yLw2493XZBYIM1dnLQ==", - "requires": { - } + "requires": {} }, "react-native-math-view": { "version": "3.9.5", @@ -37614,8 +37572,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-5.0.0.tgz", "integrity": "sha512-QXtBBmbDtwq9X8WAPLn+OctIeEtnJOQ+RCT6iweaypvFTydt2baLPtawTAbCSXKuWpVDqDAdmZnlQjCcavNzoA==", - "requires": { - } + "requires": {} }, "react-native-permissions": { "version": "3.8.4", @@ -37656,8 +37613,7 @@ "version": "4.7.1", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.7.1.tgz", "integrity": "sha512-X2pJG2ttmAbiGlItWedvDkZg1T1ikmEDiz+7HsiIwAIm2UbFqlhqn+B1JF53mSxPzdNaDcCQVHRNPvj8oFu6Yg==", - "requires": { - } + "requires": {} }, "react-native-screens": { "version": "3.24.0", @@ -37690,8 +37646,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz", "integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==", - "requires": { - } + "requires": {} }, "react-native-svg": { "version": "13.11.0", @@ -39365,8 +39320,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", "dev": true, - "requires": { - } + "requires": {} }, "ts-jest": { "version": "29.1.1", @@ -39687,15 +39641,13 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.6.tgz", "integrity": "sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg==", - "requires": { - } + "requires": {} }, "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "requires": { - } + "requires": {} }, "utf8": { "version": "3.0.0", @@ -40028,8 +39980,7 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", - "requires": { - } + "requires": {} }, "xdate": { "version": "0.8.2", diff --git a/package.json b/package.json index 25aafaaf6..6c325d326 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@mattermost/calls": "github:mattermost/calls-common#v0.17.0", "@mattermost/compass-icons": "0.1.37", "@mattermost/react-native-emm": "1.3.5", - "@mattermost/react-native-network-client": "1.3.8", + "@mattermost/react-native-network-client": "1.4.0", "@mattermost/react-native-paste-input": "0.6.4", "@mattermost/react-native-turbo-log": "0.2.3", "@msgpack/msgpack": "2.8.0",