From 83c5a0e4f41aad9c1d201bfa7fee25981d16463c Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Thu, 17 Oct 2019 17:04:30 -0300 Subject: [PATCH 1/5] Set User-Agent Fetch & Websocket & XHR --- app/lib/methods/getSettings.js | 2 +- app/lib/methods/sendFileMessage.js | 1 + app/lib/rocketchat.js | 4 +-- patches/@rocket.chat+sdk+1.0.0-alpha.31.patch | 28 +++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 patches/@rocket.chat+sdk+1.0.0-alpha.31.patch diff --git a/app/lib/methods/getSettings.js b/app/lib/methods/getSettings.js index 5cd8a04d0f6..d1f0054b9ba 100644 --- a/app/lib/methods/getSettings.js +++ b/app/lib/methods/getSettings.js @@ -55,7 +55,7 @@ export default async function() { const db = database.active; const settingsParams = JSON.stringify(Object.keys(settings)); // RC 0.60.0 - const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ settingsParams }}}`).then(response => response.json()); + const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ settingsParams }}}`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); if (!result.success) { return; diff --git a/app/lib/methods/sendFileMessage.js b/app/lib/methods/sendFileMessage.js index dc8674119e9..b05ee517aea 100644 --- a/app/lib/methods/sendFileMessage.js +++ b/app/lib/methods/sendFileMessage.js @@ -78,6 +78,7 @@ export function sendFileMessage(rid, fileInfo, tmid, server, user) { xhr.setRequestHeader('X-Auth-Token', token); xhr.setRequestHeader('X-User-Id', id); + xhr.setRequestHeader('User-Agent', 'MY-UA-STRING'); xhr.upload.onprogress = async({ total, loaded }) => { try { diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index a9007b71f78..c49728c8bf0 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -87,7 +87,7 @@ const RocketChat = { }, async getServerInfo(server) { try { - const result = await fetch(`${ server }/api/info`).then(response => response.json()); + const result = await fetch(`${ server }/api/info`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); if (result.success) { if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) { return { @@ -814,7 +814,7 @@ const RocketChat = { async getLoginServices(server) { try { let loginServices = []; - const loginServicesResult = await fetch(`${ server }/api/v1/settings.oauth`).then(response => response.json()); + const loginServicesResult = await fetch(`${ server }/api/v1/settings.oauth`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); if (loginServicesResult.success && loginServicesResult.services.length > 0) { const { services } = loginServicesResult; diff --git a/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch b/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch new file mode 100644 index 00000000000..539346d6eb4 --- /dev/null +++ b/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch @@ -0,0 +1,28 @@ +diff --git a/node_modules/@rocket.chat/sdk/lib/api/api.js b/node_modules/@rocket.chat/sdk/lib/api/api.js +index 5b7dc21..d453092 100644 +--- a/node_modules/@rocket.chat/sdk/lib/api/api.js ++++ b/node_modules/@rocket.chat/sdk/lib/api/api.js +@@ -80,8 +80,8 @@ var Client = /** @class */ (function () { + }); + Client.prototype.getHeaders = function (options) { + return options && options.customHeaders ? +- options.customHeaders : +- this.headers; ++ { ...options.customHeaders, 'User-Agent': 'cachorro ' } : ++ { ...this.headers, 'User-Agent': 'cachorro ' }; + }; + Client.prototype.getBody = function (data) { + return data instanceof FormData ? +diff --git a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js +index e3510c7..cb8c553 100644 +--- a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js ++++ b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js +@@ -145,7 +145,7 @@ var Socket = /** @class */ (function (_super) { + return !_this.alive() && _this.reopen(); + }, ms); + try { +- connection = new universal_websocket_client_1.default(this.host); ++ connection = new universal_websocket_client_1.default(this.host, null, { headers: { 'User-Agent': 'cachorro '} }); + connection.onerror = reject; + } + catch (err) { From 876741fddb7247253151d30185775ad458c75e02 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Fri, 18 Oct 2019 08:06:46 -0300 Subject: [PATCH 2/5] Set User-Agent --- app/lib/methods/getSettings.js | 3 +- app/lib/methods/sendFileMessage.js | 3 +- app/lib/rocketchat.js | 7 ++- app/utils/fetch.js | 3 + patches/@rocket.chat+sdk+1.0.0-alpha.31.patch | 62 ++++++++++++++----- 5 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 app/utils/fetch.js diff --git a/app/lib/methods/getSettings.js b/app/lib/methods/getSettings.js index d1f0054b9ba..1dd8b7909b8 100644 --- a/app/lib/methods/getSettings.js +++ b/app/lib/methods/getSettings.js @@ -8,6 +8,7 @@ import settings from '../../constants/settings'; import log from '../../utils/log'; import database from '../database'; import protectedFunction from './helpers/protectedFunction'; +import fetch from '../../utils/fetch'; const serverInfoKeys = ['Site_Name', 'UI_Use_Real_Name', 'FileUpload_MediaTypeWhiteList', 'FileUpload_MaxFileSize']; @@ -55,7 +56,7 @@ export default async function() { const db = database.active; const settingsParams = JSON.stringify(Object.keys(settings)); // RC 0.60.0 - const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ settingsParams }}}`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); + const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ settingsParams }}}`).then(response => response.json()); if (!result.success) { return; diff --git a/app/lib/methods/sendFileMessage.js b/app/lib/methods/sendFileMessage.js index b05ee517aea..51133915867 100644 --- a/app/lib/methods/sendFileMessage.js +++ b/app/lib/methods/sendFileMessage.js @@ -2,6 +2,7 @@ import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import database from '../database'; import log from '../../utils/log'; +import { headers } from '../../utils/fetch'; const uploadQueue = {}; @@ -78,7 +79,7 @@ export function sendFileMessage(rid, fileInfo, tmid, server, user) { xhr.setRequestHeader('X-Auth-Token', token); xhr.setRequestHeader('X-User-Id', id); - xhr.setRequestHeader('User-Agent', 'MY-UA-STRING'); + xhr.setRequestHeader('User-Agent', headers['User-Agent']); xhr.upload.onprogress = async({ total, loaded }) => { try { diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index c49728c8bf0..01834e1663b 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1,6 +1,6 @@ import { AsyncStorage, InteractionManager } from 'react-native'; import semver from 'semver'; -import { Rocketchat as RocketchatClient } from '@rocket.chat/sdk'; +import { Rocketchat as RocketchatClient, settings as RCSettings } from '@rocket.chat/sdk'; import RNUserDefaults from 'rn-user-defaults'; import { Q } from '@nozbe/watermelondb'; import * as FileSystem from 'expo-file-system'; @@ -12,6 +12,7 @@ import database from './database'; import log from '../utils/log'; import { isIOS, getBundleId } from '../utils/deviceInfo'; import { extractHostname } from '../utils/server'; +import fetch from '../utils/fetch'; import { setUser, setLoginServices, loginRequest, loginFailure, logout @@ -87,7 +88,7 @@ const RocketChat = { }, async getServerInfo(server) { try { - const result = await fetch(`${ server }/api/info`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); + const result = await fetch(`${ server }/api/info`).then(response => response.json()); if (result.success) { if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) { return { @@ -148,6 +149,8 @@ const RocketChat = { this.sdk = null; } + RCSettings.customHeaders = { 'User-Agent': 'cachorro' }; + // Use useSsl: false only if server url starts with http:// const useSsl = !/http:\/\//.test(server); diff --git a/app/utils/fetch.js b/app/utils/fetch.js new file mode 100644 index 00000000000..a3aff782c28 --- /dev/null +++ b/app/utils/fetch.js @@ -0,0 +1,3 @@ +export const headers = { 'User-Agent': 'RC-RN Mobile' }; + +export default url => fetch(url, { headers }); diff --git a/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch b/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch index 539346d6eb4..8e73bf1ef3a 100644 --- a/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch +++ b/patches/@rocket.chat+sdk+1.0.0-alpha.31.patch @@ -1,28 +1,60 @@ diff --git a/node_modules/@rocket.chat/sdk/lib/api/api.js b/node_modules/@rocket.chat/sdk/lib/api/api.js -index 5b7dc21..d453092 100644 +index 5b7dc21..49f1af5 100644 --- a/node_modules/@rocket.chat/sdk/lib/api/api.js +++ b/node_modules/@rocket.chat/sdk/lib/api/api.js -@@ -80,8 +80,8 @@ var Client = /** @class */ (function () { - }); - Client.prototype.getHeaders = function (options) { - return options && options.customHeaders ? -- options.customHeaders : -- this.headers; -+ { ...options.customHeaders, 'User-Agent': 'cachorro ' } : -+ { ...this.headers, 'User-Agent': 'cachorro ' }; - }; - Client.prototype.getBody = function (data) { - return data instanceof FormData ? +@@ -62,6 +62,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); + var log_1 = require("../log"); + var message_1 = require("../message"); + var tiny_events_1 = require("tiny-events"); ++var settings = require("../settings"); + var Client = /** @class */ (function () { + function Client(_a) { + var _b = _a.host, host = _b === void 0 ? 'http://localhost:3000' : _b; +@@ -70,7 +71,7 @@ var Client = /** @class */ (function () { + } + Object.defineProperty(Client.prototype, "headers", { + get: function () { +- return __assign({ 'Content-Type': 'application/json' }, this._headers); ++ return __assign({ 'Content-Type': 'application/json', ...settings.customHeaders }, this._headers); + }, + set: function (obj) { + this._headers = obj; diff --git a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js -index e3510c7..cb8c553 100644 +index e3510c7..e951959 100644 --- a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js +++ b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.js -@@ -145,7 +145,7 @@ var Socket = /** @class */ (function (_super) { +@@ -110,6 +110,7 @@ tiny_events_1.EventEmitter.prototype.removeAllListeners = function (event) { + var interfaces_1 = require("../../interfaces"); + var util_1 = require("../util"); + var js_sha256_1 = require("js-sha256"); ++var settings = require("../settings"); + /** Websocket handler class, manages connections and subscriptions by DDP */ + var Socket = /** @class */ (function (_super) { + __extends(Socket, _super); +@@ -145,7 +146,7 @@ var Socket = /** @class */ (function (_super) { return !_this.alive() && _this.reopen(); }, ms); try { - connection = new universal_websocket_client_1.default(this.host); -+ connection = new universal_websocket_client_1.default(this.host, null, { headers: { 'User-Agent': 'cachorro '} }); ++ connection = new universal_websocket_client_1.default(this.host, null, { headers: settings.customHeaders }); connection.onerror = reject; } catch (err) { +diff --git a/node_modules/@rocket.chat/sdk/lib/settings.d.ts b/node_modules/@rocket.chat/sdk/lib/settings.d.ts +index 99eb828..8c99307 100644 +--- a/node_modules/@rocket.chat/sdk/lib/settings.d.ts ++++ b/node_modules/@rocket.chat/sdk/lib/settings.d.ts +@@ -17,3 +17,4 @@ export declare let dmCacheMaxAge: number; + export declare let token: string; + export declare let rid: string; + export declare let department: string; ++export declare let customHeaders: object; +diff --git a/node_modules/@rocket.chat/sdk/lib/settings.js b/node_modules/@rocket.chat/sdk/lib/settings.js +index 822c286..15f2688 100644 +--- a/node_modules/@rocket.chat/sdk/lib/settings.js ++++ b/node_modules/@rocket.chat/sdk/lib/settings.js +@@ -30,3 +30,4 @@ exports.token = process.env.LIVECHAT_TOKEN || ''; + exports.rid = process.env.LIVECHAT_ROOM || ''; + exports.department = process.env.LIVECHAT_DEPARTMENT || ''; + //# sourceMappingURL=settings.js.map ++exports.customHeaders = {}; From b3090f3be70cfcbbc883630cea619cc5231c1d73 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Fri, 18 Oct 2019 08:15:45 -0300 Subject: [PATCH 3/5] Custom User Agent on fetch/websocket --- app/utils/fetch.js | 13 +++++++++++-- package.json | 1 + yarn.lock | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/utils/fetch.js b/app/utils/fetch.js index a3aff782c28..b4330a716b9 100644 --- a/app/utils/fetch.js +++ b/app/utils/fetch.js @@ -1,3 +1,12 @@ -export const headers = { 'User-Agent': 'RC-RN Mobile' }; +import { Platform } from 'react-native'; +import VersionNumber from 'react-native-version-number'; -export default url => fetch(url, { headers }); +export const headers = { 'User-Agent': `RC-RN Mobile/${ VersionNumber.appVersion } (build: ${ VersionNumber.buildVersion }; os: ${ Platform.OS } ${ Platform.Version })` }; + +export default (url, options = {}) => { + let customOptions = { ...options, headers }; + if (options && options.headers) { + customOptions = { ...customOptions, headers: { ...options.headers, ...headers } }; + } + return fetch(url, customOptions); +}; diff --git a/package.json b/package.json index cfbcfa645f7..f6388e88088 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "react-native-splash-screen": "^3.2.0", "react-native-unimodules": "0.5.3", "react-native-vector-icons": "6.6.0", + "react-native-version-number": "^0.3.6", "react-native-video": "^5.0.0", "react-native-webview": "6.8.0", "react-navigation": "^4.0.5", diff --git a/yarn.lock b/yarn.lock index 6159a4da945..eb9bc353108 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9312,6 +9312,11 @@ react-native-vector-icons@6.6.0: prop-types "^15.6.2" yargs "^13.2.2" +react-native-version-number@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/react-native-version-number/-/react-native-version-number-0.3.6.tgz#dd8b1435fc217df0a166d7e4a61fdc993f3e7437" + integrity sha512-TdyXiK90NiwmSbmAUlUBOV6WI1QGoqtvZZzI5zQY4fKl67B3ZrZn/h+Wy/OYIKKFMfePSiyfeIs8LtHGOZ/NgA== + react-native-video@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-5.0.0.tgz#30b58e31f0776bfa8dc71109c25114d4e50d9209" From 466f238efc2abdba734462183680f2bc95a57ee3 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Fri, 18 Oct 2019 08:20:36 -0300 Subject: [PATCH 4/5] Fix names --- app/lib/rocketchat.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 01834e1663b..1040410c33c 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1,6 +1,6 @@ import { AsyncStorage, InteractionManager } from 'react-native'; import semver from 'semver'; -import { Rocketchat as RocketchatClient, settings as RCSettings } from '@rocket.chat/sdk'; +import { Rocketchat as RocketchatClient, settings as RocketChatSettings } from '@rocket.chat/sdk'; import RNUserDefaults from 'rn-user-defaults'; import { Q } from '@nozbe/watermelondb'; import * as FileSystem from 'expo-file-system'; @@ -12,7 +12,7 @@ import database from './database'; import log from '../utils/log'; import { isIOS, getBundleId } from '../utils/deviceInfo'; import { extractHostname } from '../utils/server'; -import fetch from '../utils/fetch'; +import fetch, { headers } from '../utils/fetch'; import { setUser, setLoginServices, loginRequest, loginFailure, logout @@ -58,6 +58,8 @@ const MIN_ROCKETCHAT_VERSION = '0.70.0'; const STATUSES = ['offline', 'online', 'away', 'busy']; +RocketChatSettings.customHeaders = headers; + const RocketChat = { TOKEN_KEY, callJitsi, @@ -149,8 +151,6 @@ const RocketChat = { this.sdk = null; } - RCSettings.customHeaders = { 'User-Agent': 'cachorro' }; - // Use useSsl: false only if server url starts with http:// const useSsl = !/http:\/\//.test(server); @@ -817,7 +817,7 @@ const RocketChat = { async getLoginServices(server) { try { let loginServices = []; - const loginServicesResult = await fetch(`${ server }/api/v1/settings.oauth`, { headers: { 'User-Agent': 'MY-UA-STRING' } }).then(response => response.json()); + const loginServicesResult = await fetch(`${ server }/api/v1/settings.oauth`).then(response => response.json()); if (loginServicesResult.success && loginServicesResult.services.length > 0) { const { services } = loginServicesResult; From 70fa9fbfd1f92e0ac348159cff97dae6bf6dba08 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Fri, 18 Oct 2019 11:06:41 -0300 Subject: [PATCH 5/5] Use DeviceInfo --- app/utils/fetch.js | 4 ++-- package.json | 1 - yarn.lock | 5 ----- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/app/utils/fetch.js b/app/utils/fetch.js index b4330a716b9..1e526af2d25 100644 --- a/app/utils/fetch.js +++ b/app/utils/fetch.js @@ -1,7 +1,7 @@ import { Platform } from 'react-native'; -import VersionNumber from 'react-native-version-number'; +import DeviceInfo from 'react-native-device-info'; -export const headers = { 'User-Agent': `RC-RN Mobile/${ VersionNumber.appVersion } (build: ${ VersionNumber.buildVersion }; os: ${ Platform.OS } ${ Platform.Version })` }; +export const headers = { 'User-Agent': `RC-RN Mobile/${ DeviceInfo.getVersion() } (build: ${ DeviceInfo.getBuildNumber() }; os: ${ Platform.OS } ${ DeviceInfo.getSystemVersion() })` }; export default (url, options = {}) => { let customOptions = { ...options, headers }; diff --git a/package.json b/package.json index f6388e88088..cfbcfa645f7 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,6 @@ "react-native-splash-screen": "^3.2.0", "react-native-unimodules": "0.5.3", "react-native-vector-icons": "6.6.0", - "react-native-version-number": "^0.3.6", "react-native-video": "^5.0.0", "react-native-webview": "6.8.0", "react-navigation": "^4.0.5", diff --git a/yarn.lock b/yarn.lock index eb9bc353108..6159a4da945 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9312,11 +9312,6 @@ react-native-vector-icons@6.6.0: prop-types "^15.6.2" yargs "^13.2.2" -react-native-version-number@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/react-native-version-number/-/react-native-version-number-0.3.6.tgz#dd8b1435fc217df0a166d7e4a61fdc993f3e7437" - integrity sha512-TdyXiK90NiwmSbmAUlUBOV6WI1QGoqtvZZzI5zQY4fKl67B3ZrZn/h+Wy/OYIKKFMfePSiyfeIs8LtHGOZ/NgA== - react-native-video@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-5.0.0.tgz#30b58e31f0776bfa8dc71109c25114d4e50d9209"