From c7fbfedb9d3617e27e911f2c768044848a0d0539 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Tue, 12 Nov 2019 16:42:31 -0300 Subject: [PATCH 1/7] Improve error messages on connect --- app/i18n/locales/en.js | 4 +++- app/i18n/locales/pt-BR.js | 4 +++- app/lib/rocketchat.js | 32 +++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index 34554419572..b2456441890 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -257,6 +257,7 @@ export default { No_Reactions: 'No Reactions', No_Read_Receipts: 'No Read Receipts', Not_logged: 'Not logged', + Not_is_rc: 'Apparently this is not a server Rocket.Chat - Contact your server admin', Nothing: 'Nothing', Nothing_to_save: 'Nothing to save!', Notify_active_in_this_room: 'Notify active users in this room', @@ -375,7 +376,7 @@ export default { Tap_to_view_servers_list: 'Tap to view servers list', Terms_of_Service: ' Terms of Service ', Theme: 'Theme', - The_URL_is_invalid: 'The URL you entered is invalid. Check it and try again, please!', + The_URL_is_invalid: 'The URL you entered is invalid or unable to establish a secure connection. Check it and try again, please!', There_was_an_error_while_action: 'There was an error while {{action}}!', This_room_is_blocked: 'This room is blocked', This_room_is_read_only: 'This room is read only', @@ -420,6 +421,7 @@ export default { Video_call: 'Video call', View_Original: 'View Original', Voice_call: 'Voice call', + Websocket_disabled: 'Server must have Websocket enabled - Contact your server admin', Welcome: 'Welcome', Welcome_to_RocketChat: 'Welcome to Rocket.Chat', Whats_your_2fa: 'What\'s your 2FA code?', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index dbc66a0c433..dc2577e4f4e 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -242,6 +242,7 @@ export default { Nothing_to_save: 'Nada para salvar!', Notify_active_in_this_room: 'Notificar usuários ativos nesta sala', Notify_all_in_this_room: 'Notificar todos nesta sala', + Not_is_rc: 'Aparentemente este não é um servidor Rocket.Chat - Contate o administrador do servidor', Offline: 'Offline', Oops: 'Ops!', Online: 'Online', @@ -334,7 +335,7 @@ export default { Take_a_photo: 'Tirar uma foto', Take_a_video: 'Gravar um vídeo', Terms_of_Service: ' Termos de Serviço ', - The_URL_is_invalid: 'A URL fornecida é inválida ou não acessível. Por favor tente novamente, mas com uma url diferente.', + The_URL_is_invalid: 'A URL fornecida é inválida ou não acessível ou incapaz de estabelecer uma conexão segura. Por favor tente novamente, mas com uma url diferente.', There_was_an_error_while_action: 'Aconteceu um erro {{action}}!', This_room_is_blocked: 'Este quarto está bloqueado', This_room_is_read_only: 'Este quarto é apenas de leitura', @@ -375,6 +376,7 @@ export default { Username_or_email: 'Usuário ou email', Video_call: 'Chamada de vídeo', Voice_call: 'Chamada de voz', + Websocket_disabled: 'O servidor precisa ter o Websocket ativado - Contate o administrador do servidor', Welcome: 'Bem vindo', Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat', Whats_your_2fa: 'Qual seu código de autenticação?', diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index af1a4c1462e..0d7740067fe 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -88,9 +88,39 @@ const RocketChat = { console.warn(`RNUserDefaults error: ${ error.message }`); } }, + async enabledWebsocket(server) { + try { + // Use useSsl: false only if server url starts with http:// + const useSsl = !/http:\/\//.test(server); + const sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl }); + await sdk.connect(); + return true; + } catch (e) { + if (e.message && e.message.includes('400')) { + return false; + } + } + return true; + }, async getServerInfo(server) { try { - const result = await fetch(`${ server }/api/info`).then(response => response.json()); + let result = await fetch(`${ server }/api/info`) + .then(response => response.text()); + try { + result = JSON.parse(result); + } catch (e) { + return { + success: false, + message: 'Not_is_rc' + }; + } + const websocket = await this.enabledWebsocket(server); + if (!websocket) { + return { + success: false, + message: 'Websocket_disabled' + }; + } if (result.success) { if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) { return { From 9a9c5688b5b4606eaf8fe9cf35d94fd72a7267ba Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Tue, 12 Nov 2019 19:22:27 -0300 Subject: [PATCH 2/7] Not is rc rule --- app/lib/rocketchat.js | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 0d7740067fe..585caed51e5 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -88,39 +88,24 @@ const RocketChat = { console.warn(`RNUserDefaults error: ${ error.message }`); } }, - async enabledWebsocket(server) { - try { - // Use useSsl: false only if server url starts with http:// - const useSsl = !/http:\/\//.test(server); - const sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl }); - await sdk.connect(); - return true; - } catch (e) { - if (e.message && e.message.includes('400')) { - return false; - } - } - return true; - }, async getServerInfo(server) { try { let result = await fetch(`${ server }/api/info`) .then(response => response.text()); try { result = JSON.parse(result); - } catch (e) { + if (!{}.hasOwnProperty.call(result, 'success')) { + return { + success: false, + message: 'Not_is_rc' + }; + } + } catch (e) { // if returns html on body return { success: false, message: 'Not_is_rc' }; } - const websocket = await this.enabledWebsocket(server); - if (!websocket) { - return { - success: false, - message: 'Websocket_disabled' - }; - } if (result.success) { if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) { return { From 1ea033d8bc3c3879c8d3849bb45eb569a3e1d354 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Wed, 13 Nov 2019 09:35:27 -0300 Subject: [PATCH 3/7] Websocket disabled --- app/lib/rocketchat.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 585caed51e5..11dfe0eb0e5 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1,4 +1,4 @@ -import { AsyncStorage, InteractionManager } from 'react-native'; +import { AsyncStorage, InteractionManager, Alert } from 'react-native'; import semver from 'semver'; import { Rocketchat as RocketchatClient, settings as RocketChatSettings } from '@rocket.chat/sdk'; import RNUserDefaults from 'rn-user-defaults'; @@ -48,6 +48,8 @@ import callJitsi from './methods/callJitsi'; import { getDeviceToken } from '../notifications/push'; import { SERVERS, SERVER_URL } from '../constants/userDefaults'; import { setActiveUsers } from '../actions/activeUsers'; +import Navigation from './Navigation'; +import I18n from '../i18n'; const TOKEN_KEY = 'reactnativemeteor_usertoken'; const SORT_PREFS_KEY = 'RC_SORT_PREFS_KEY'; @@ -181,10 +183,15 @@ const RocketChat = { .catch((err) => { console.log('connect error', err); - // when `connect` raises an error, we try again in 10 seconds - this.connectTimeout = setTimeout(() => { - this.connect({ server, user }); - }, 10000); + if (err.message && err.message.includes('400')) { + Navigation.navigate('NewServerView'); + Alert.alert(I18n.t('Oops'), I18n.t('Websocket_disabled')); + } else { + // when `connect` raises an error, we try again in 10 seconds + this.connectTimeout = setTimeout(() => { + this.connect({ server, user }); + }, 10000); + } }); this.connectedListener = this.sdk.onStreamData('connected', () => { From b3d9e0e71f43af9e60e9dd02169f6824f66e7af1 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Wed, 13 Nov 2019 10:52:00 -0300 Subject: [PATCH 4/7] Improve --- app/i18n/locales/en.js | 7 ++--- app/i18n/locales/pt-BR.js | 7 ++--- app/lib/rocketchat.js | 56 +++++++++++++++++++-------------------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index b2456441890..9a5de51b726 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -136,6 +136,7 @@ export default { connecting_server: 'connecting to server', Connecting: 'Connecting...', Contact_us: 'Contact us', + Contact_your_server_admin: 'Contact your server admin.', Continue_with: 'Continue with', Copied_to_clipboard: 'Copied to clipboard!', Copy: 'Copy', @@ -257,7 +258,7 @@ export default { No_Reactions: 'No Reactions', No_Read_Receipts: 'No Read Receipts', Not_logged: 'Not logged', - Not_is_rc: 'Apparently this is not a server Rocket.Chat - Contact your server admin', + Not_RC_Server: 'This is not a Rocket.Chat server.\n{{contact}}', Nothing: 'Nothing', Nothing_to_save: 'Nothing to save!', Notify_active_in_this_room: 'Notify active users in this room', @@ -376,7 +377,7 @@ export default { Tap_to_view_servers_list: 'Tap to view servers list', Terms_of_Service: ' Terms of Service ', Theme: 'Theme', - The_URL_is_invalid: 'The URL you entered is invalid or unable to establish a secure connection. Check it and try again, please!', + The_URL_is_invalid: 'Invalid URL or unable to establish a secure connection.\n{{contact}}', There_was_an_error_while_action: 'There was an error while {{action}}!', This_room_is_blocked: 'This room is blocked', This_room_is_read_only: 'This room is read only', @@ -421,7 +422,7 @@ export default { Video_call: 'Video call', View_Original: 'View Original', Voice_call: 'Voice call', - Websocket_disabled: 'Server must have Websocket enabled - Contact your server admin', + Websocket_disabled: 'Server must have Websocket enabled.\n{{contact}}', Welcome: 'Welcome', Welcome_to_RocketChat: 'Welcome to Rocket.Chat', Whats_your_2fa: 'What\'s your 2FA code?', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index dc2577e4f4e..76d6434f8e2 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -138,6 +138,7 @@ export default { connecting_server: 'conectando no servidor', Connecting: 'Conectando...', Continue_with: 'Entrar com', + Contact_your_server_admin: 'Contate o administrador do servidor.', Copied_to_clipboard: 'Copiado para a área de transferência!', Copy: 'Copiar', Permalink: 'Link-Permanente', @@ -242,7 +243,7 @@ export default { Nothing_to_save: 'Nada para salvar!', Notify_active_in_this_room: 'Notificar usuários ativos nesta sala', Notify_all_in_this_room: 'Notificar todos nesta sala', - Not_is_rc: 'Aparentemente este não é um servidor Rocket.Chat - Contate o administrador do servidor', + Not_RC_Server: 'Este não é um servidor Rocket.Chat.\n{{contact}}', Offline: 'Offline', Oops: 'Ops!', Online: 'Online', @@ -335,7 +336,7 @@ export default { Take_a_photo: 'Tirar uma foto', Take_a_video: 'Gravar um vídeo', Terms_of_Service: ' Termos de Serviço ', - The_URL_is_invalid: 'A URL fornecida é inválida ou não acessível ou incapaz de estabelecer uma conexão segura. Por favor tente novamente, mas com uma url diferente.', + The_URL_is_invalid: 'A URL fornecida é inválida ou incapaz de estabelecer uma conexão segura.\n{{contact}}', There_was_an_error_while_action: 'Aconteceu um erro {{action}}!', This_room_is_blocked: 'Este quarto está bloqueado', This_room_is_read_only: 'Este quarto é apenas de leitura', @@ -376,7 +377,7 @@ export default { Username_or_email: 'Usuário ou email', Video_call: 'Chamada de vídeo', Voice_call: 'Chamada de voz', - Websocket_disabled: 'O servidor precisa ter o Websocket ativado - Contate o administrador do servidor', + Websocket_disabled: 'O servidor precisa ter o Websocket ativado.\n{{contact}}', Welcome: 'Bem vindo', Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat', Whats_your_2fa: 'Qual seu código de autenticação?', diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 11dfe0eb0e5..47bb6a76d9f 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1,4 +1,4 @@ -import { AsyncStorage, InteractionManager, Alert } from 'react-native'; +import { AsyncStorage, InteractionManager } from 'react-native'; import semver from 'semver'; import { Rocketchat as RocketchatClient, settings as RocketChatSettings } from '@rocket.chat/sdk'; import RNUserDefaults from 'rn-user-defaults'; @@ -48,7 +48,6 @@ import callJitsi from './methods/callJitsi'; import { getDeviceToken } from '../notifications/push'; import { SERVERS, SERVER_URL } from '../constants/userDefaults'; import { setActiveUsers } from '../actions/activeUsers'; -import Navigation from './Navigation'; import I18n from '../i18n'; const TOKEN_KEY = 'reactnativemeteor_usertoken'; @@ -91,23 +90,26 @@ const RocketChat = { } }, async getServerInfo(server) { + const notRCServer = { + success: false, + message: 'Not_RC_Server', + messageOptions: { + contact: I18n.t('Contact_your_server_admin') + } + }; try { - let result = await fetch(`${ server }/api/info`) - .then(response => response.text()); - try { - result = JSON.parse(result); - if (!{}.hasOwnProperty.call(result, 'success')) { - return { - success: false, - message: 'Not_is_rc' - }; + const result = await fetch(`${ server }/api/info`).then(async(response) => { + let res = notRCServer; + try { + res = await response.json(); + if (!(res && res.success)) { + return notRCServer; + } + } catch (e) { + // do nothing } - } catch (e) { // if returns html on body - return { - success: false, - message: 'Not_is_rc' - }; - } + return res; + }); if (result.success) { if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) { return { @@ -119,14 +121,17 @@ const RocketChat = { } }; } - return result; } + return result; } catch (e) { log(e); } return { success: false, - message: 'The_URL_is_invalid' + message: 'The_URL_is_invalid', + messageOptions: { + contact: I18n.t('Contact_your_server_admin') + } }; }, stopListener(listener) { @@ -183,15 +188,10 @@ const RocketChat = { .catch((err) => { console.log('connect error', err); - if (err.message && err.message.includes('400')) { - Navigation.navigate('NewServerView'); - Alert.alert(I18n.t('Oops'), I18n.t('Websocket_disabled')); - } else { - // when `connect` raises an error, we try again in 10 seconds - this.connectTimeout = setTimeout(() => { - this.connect({ server, user }); - }, 10000); - } + // when `connect` raises an error, we try again in 10 seconds + this.connectTimeout = setTimeout(() => { + this.connect({ server, user }); + }, 10000); }); this.connectedListener = this.sdk.onStreamData('connected', () => { From 3edad7c5a1e0c006a324e6fd44b6c21cf039230c Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Wed, 13 Nov 2019 16:03:38 -0300 Subject: [PATCH 5/7] getWebsocketInfo --- app/lib/rocketchat.js | 27 +++++++++++++++++++++++++++ app/sagas/selectServer.js | 9 +++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 31089d30694..81b51f50a2d 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -89,6 +89,33 @@ const RocketChat = { console.warn(`RNUserDefaults error: ${ error.message }`); } }, + async getWebsocketInfo({ server }) { + // Use useSsl: false only if server url starts with http:// + const useSsl = !/http:\/\//.test(server); + + const sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl }); + + try { + await sdk.connect(); + } catch (err) { + console.log(err); + if (err.message && err.message.includes('400')) { + return { + success: false, + message: 'Websocket_disabled', + messageOptions: { + contact: I18n.t('Contact_your_server_admin') + } + }; + } + } + + sdk.disconnect(); + + return { + success: true + }; + }, async getServerInfo(server) { const notRCServer = { success: false, diff --git a/app/sagas/selectServer.js b/app/sagas/selectServer.js index b997845e7c8..64795ede2b6 100644 --- a/app/sagas/selectServer.js +++ b/app/sagas/selectServer.js @@ -22,9 +22,14 @@ import { SERVERS, TOKEN, SERVER_URL } from '../constants/userDefaults'; const getServerInfo = function* getServerInfo({ server, raiseError = true }) { try { const serverInfo = yield RocketChat.getServerInfo(server); - if (!serverInfo.success) { + let websocketInfo = true; + if (raiseError) { + websocketInfo = yield RocketChat.getWebsocketInfo({ server }); + } + if (!serverInfo.success || !websocketInfo.success) { if (raiseError) { - Alert.alert(I18n.t('Oops'), I18n.t(serverInfo.message, serverInfo.messageOptions)); + const info = serverInfo.success ? websocketInfo : serverInfo; + Alert.alert(I18n.t('Oops'), I18n.t(info.message, info.messageOptions)); } yield put(serverFailure()); return; From e66293a524ec855aedc4b4f3b8fc2d586398a44e Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Wed, 13 Nov 2019 16:32:57 -0300 Subject: [PATCH 6/7] Change websocket message --- app/i18n/locales/en.js | 2 +- app/i18n/locales/pt-BR.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index 9a5de51b726..6148301880e 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -422,7 +422,7 @@ export default { Video_call: 'Video call', View_Original: 'View Original', Voice_call: 'Voice call', - Websocket_disabled: 'Server must have Websocket enabled.\n{{contact}}', + Websocket_disabled: 'Websocket is disabled for this server.\n{{contact}}', Welcome: 'Welcome', Welcome_to_RocketChat: 'Welcome to Rocket.Chat', Whats_your_2fa: 'What\'s your 2FA code?', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index 76d6434f8e2..fed61464013 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -377,7 +377,7 @@ export default { Username_or_email: 'Usuário ou email', Video_call: 'Chamada de vídeo', Voice_call: 'Chamada de voz', - Websocket_disabled: 'O servidor precisa ter o Websocket ativado.\n{{contact}}', + Websocket_disabled: 'Websocket está desativado para esse servidor.\n{{contact}}', Welcome: 'Bem vindo', Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat', Whats_your_2fa: 'Qual seu código de autenticação?', From 58c24a109459e3b00f6b9fa6478706e7c28bf477 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Wed, 13 Nov 2019 16:34:35 -0300 Subject: [PATCH 7/7] Remove log --- app/lib/rocketchat.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 81b51f50a2d..d253c8204b6 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -98,7 +98,6 @@ const RocketChat = { try { await sdk.connect(); } catch (err) { - console.log(err); if (err.message && err.message.includes('400')) { return { success: false,