From 81dc10de30e00e1aeec5d5c18bc86b773a34dfbd Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 7 Dec 2021 10:55:46 -0300 Subject: [PATCH 1/3] Bump version to 4.23.0 (#3546) --- android/app/build.gradle | 2 +- ios/RocketChatRN.xcodeproj/project.pbxproj | 4 ++-- ios/RocketChatRN/Info.plist | 2 +- ios/ShareRocketChatRN/Info.plist | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 75b4490f1..524eebd82 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -144,7 +144,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.22.0" + versionName "4.23.0" vectorDrawables.useSupportLibrary = true if (!isFoss) { manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index d9ff1460e..f1ac13c9f 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -1682,7 +1682,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.22.0; + MARKETING_VERSION = 4.23.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; @@ -1719,7 +1719,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.22.0; + MARKETING_VERSION = 4.23.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index 201436c42..93504495a 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.22.0 + 4.23.0 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist index f38c9140c..c363596be 100644 --- a/ios/ShareRocketChatRN/Info.plist +++ b/ios/ShareRocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.22.0 + 4.23.0 CFBundleVersion 1 KeychainGroup diff --git a/package.json b/package.json index 1582969f2..f807f6166 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket-chat-reactnative", - "version": "4.22.0", + "version": "4.23.0", "private": true, "scripts": { "start": "react-native start", From 838be232ffa310e8f10101111ac56a7c5fd26bdc Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 7 Dec 2021 10:57:11 -0300 Subject: [PATCH 2/3] [FIX] Certificate stops working after app update on iOS (#3537) --- app/utils/sslPinning.js | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/app/utils/sslPinning.js b/app/utils/sslPinning.js index 50f944e63..c3e2128c9 100644 --- a/app/utils/sslPinning.js +++ b/app/utils/sslPinning.js @@ -7,6 +7,21 @@ import I18n from '../i18n'; import { extractHostname } from './server'; const { SSLPinning } = NativeModules; +const { documentDirectory } = FileSystem; + +const extractFileScheme = path => path.replace('file://', ''); // file:// isn't allowed by obj-C + +const getPath = name => `${documentDirectory}/${name}`; + +const persistCertificate = async (name, password) => { + const certificatePath = getPath(name); + const certificate = { + path: extractFileScheme(certificatePath), + password + }; + await UserPreferences.setMapAsync(name, certificate); + return certificate; +}; const RCSSLPinning = Platform.select({ ios: { @@ -25,17 +40,9 @@ const RCSSLPinning = Platform.select({ text: 'OK', onPress: async password => { try { - const certificatePath = `${FileSystem.documentDirectory}/${name}`; - + const certificatePath = getPath(name); await FileSystem.copyAsync({ from: uri, to: certificatePath }); - - const certificate = { - path: certificatePath.replace('file://', ''), // file:// isn't allowed by obj-C - password - }; - - await UserPreferences.setMapAsync(name, certificate); - + await persistCertificate(name, password); resolve(name); } catch (e) { reject(e); @@ -49,16 +56,19 @@ const RCSSLPinning = Platform.select({ reject(e); } }), - setCertificate: async (alias, server) => { - if (alias) { - const certificate = await UserPreferences.getMapAsync(alias); + setCertificate: async (name, server) => { + if (name) { + let certificate = await UserPreferences.getMapAsync(name); + if (!certificate.path.match(extractFileScheme(documentDirectory))) { + certificate = await persistCertificate(name, certificate.password); + } await UserPreferences.setMapAsync(extractHostname(server), certificate); } } }, android: { pickCertificate: () => SSLPinning?.pickCertificate(), - setCertificate: alias => SSLPinning?.setCertificate(alias) + setCertificate: name => SSLPinning?.setCertificate(name) } }); From 404c7cff072d44f8cb2f758ed771bae2789719bc Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 7 Dec 2021 17:05:30 -0300 Subject: [PATCH 3/3] [IMPROVE] Connection stability (#3531) --- .../omnichannel/lib/subscriptions/inquiry.js | 6 --- app/lib/methods/subscriptions/rooms.js | 17 -------- app/lib/rocketchat.js | 41 +++++++++---------- yarn.lock | 2 +- 4 files changed, 20 insertions(+), 46 deletions(-) diff --git a/app/ee/omnichannel/lib/subscriptions/inquiry.js b/app/ee/omnichannel/lib/subscriptions/inquiry.js index 00d320828..d10d5c892 100644 --- a/app/ee/omnichannel/lib/subscriptions/inquiry.js +++ b/app/ee/omnichannel/lib/subscriptions/inquiry.js @@ -6,7 +6,6 @@ import { inquiryQueueAdd, inquiryQueueRemove, inquiryQueueUpdate, inquiryRequest const removeListener = listener => listener.stop(); let connectedListener; -let disconnectedListener; let queueListener; const streamTopic = 'stream-livechat-inquiry-queue-observer'; @@ -48,10 +47,6 @@ export default function subscribeInquiry() { connectedListener.then(removeListener); connectedListener = false; } - if (disconnectedListener) { - disconnectedListener.then(removeListener); - disconnectedListener = false; - } if (queueListener) { queueListener.then(removeListener); queueListener = false; @@ -59,7 +54,6 @@ export default function subscribeInquiry() { }; connectedListener = RocketChat.onStreamData('connected', handleConnection); - disconnectedListener = RocketChat.onStreamData('close', handleConnection); queueListener = RocketChat.onStreamData(streamTopic, handleQueueMessageReceived); try { diff --git a/app/lib/methods/subscriptions/rooms.js b/app/lib/methods/subscriptions/rooms.js index 4dd84adfc..c2fc9fcdf 100644 --- a/app/lib/methods/subscriptions/rooms.js +++ b/app/lib/methods/subscriptions/rooms.js @@ -8,7 +8,6 @@ import messagesStatus from '../../../constants/messagesStatus'; import log from '../../../utils/log'; import random from '../../../utils/random'; import store from '../../createStore'; -import { roomsRequest } from '../../../actions/rooms'; import { handlePayloadUserInteraction } from '../actions'; import buildMessage from '../helpers/buildMessage'; import RocketChat from '../../rocketchat'; @@ -21,8 +20,6 @@ import { E2E_MESSAGE_TYPE } from '../../encryption/constants'; const removeListener = listener => listener.stop(); -let connectedListener; -let disconnectedListener; let streamListener; let subServer; let queue = {}; @@ -255,10 +252,6 @@ const debouncedUpdate = subscription => { }; export default function subscribeRooms() { - const handleConnection = () => { - store.dispatch(roomsRequest()); - }; - const handleStreamMessageReceived = protectedFunction(async ddpMessage => { const db = database.active; @@ -388,14 +381,6 @@ export default function subscribeRooms() { }); const stop = () => { - if (connectedListener) { - connectedListener.then(removeListener); - connectedListener = false; - } - if (disconnectedListener) { - disconnectedListener.then(removeListener); - disconnectedListener = false; - } if (streamListener) { streamListener.then(removeListener); streamListener = false; @@ -407,8 +392,6 @@ export default function subscribeRooms() { } }; - connectedListener = this.sdk.onStreamData('connected', handleConnection); - // disconnectedListener = this.sdk.onStreamData('close', handleConnection); streamListener = this.sdk.onStreamData('stream-notify-user', handleStreamMessageReceived); try { diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 5bf94d085..174eaf9a7 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -239,37 +239,34 @@ const RocketChat = { this.code = null; } - this.sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl: useSsl(server) }); + // The app can't reconnect if reopen interval is 5s while in development + this.sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl: useSsl(server), reopen: __DEV__ ? 20000 : 5000 }); this.getSettings(); - const sdkConnect = () => - this.sdk - .connect() - .then(() => { - const { server: currentServer } = reduxStore.getState().server; - if (user && user.token && server === currentServer) { - reduxStore.dispatch(loginRequest({ resume: user.token }, logoutOnError)); - } - }) - .catch(err => { - console.log('connect error', err); - - // when `connect` raises an error, we try again in 10 seconds - this.connectTimeout = setTimeout(() => { - if (this.sdk?.client?.host === server) { - sdkConnect(); - } - }, 10000); - }); - - sdkConnect(); + this.sdk + .connect() + .then(() => { + console.log('connected'); + }) + .catch(err => { + console.log('connect error', err); + }); this.connectingListener = this.sdk.onStreamData('connecting', () => { reduxStore.dispatch(connectRequest()); }); this.connectedListener = this.sdk.onStreamData('connected', () => { + const { connected } = reduxStore.getState().meteor; + if (connected) { + return; + } reduxStore.dispatch(connectSuccess()); + const { server: currentServer } = reduxStore.getState().server; + const { user } = reduxStore.getState().login; + if (user?.token && server === currentServer) { + reduxStore.dispatch(loginRequest({ resume: user.token }, logoutOnError)); + } }); this.closeListener = this.sdk.onStreamData('close', () => { diff --git a/yarn.lock b/yarn.lock index 4325aa75a..b4ca2beb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3760,7 +3760,7 @@ "@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#mobile": version "1.1.0-mobile" - resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/0ee2ded22b08b34ce7ab62b26e42a713dca0d1ac" + resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/c64e69ea22514ae3bbe24e36ca77868fdae76157" dependencies: js-sha256 "^0.9.0" lru-cache "^4.1.1"