From 4ad4b3b10324574f4d7b3bb79e5e93bcae0f0b87 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Tue, 14 Apr 2020 13:22:43 -0400 Subject: [PATCH] Validate previous app version (#4151) * Validate previous app version * Update snapshot and fix typo in constant --- .../file_attachment_image.js | 5 +- .../progressive_image.test.js.snap | 3 - .../progressive_image/progressive_image.js | 8 +-- app/mattermost.js | 7 ++- app/store/middleware.js | 16 +++++- app/utils/general.js | 13 +++++ patches/react-native-fast-image+8.1.5.patch | 56 +++++++++++++++++++ 7 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 patches/react-native-fast-image+8.1.5.patch diff --git a/app/components/file_attachment_list/file_attachment_image.js b/app/components/file_attachment_list/file_attachment_image.js index 64d4c17c1..87e42695f 100644 --- a/app/components/file_attachment_list/file_attachment_image.js +++ b/app/components/file_attachment_list/file_attachment_image.js @@ -57,11 +57,10 @@ export default class FileAttachmentImage extends PureComponent { const {file} = props; if (file && file.id) { - const headers = {Authorization: `Bearer ${Client4.getToken()}`}; - const preloadImages = [{uri: Client4.getFileThumbnailUrl(file.id), headers}]; + const preloadImages = [{uri: Client4.getFileThumbnailUrl(file.id)}]; if (isGif(file)) { - preloadImages.push({uri: Client4.getFileUrl(file.id), headers}); + preloadImages.push({uri: Client4.getFileUrl(file.id)}); } FastImage.preload(preloadImages); diff --git a/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap b/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap index 5935bb753..6b1c91027 100644 --- a/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap +++ b/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap @@ -12,9 +12,6 @@ exports[`ProgressiveImage should match snapshot 1`] = ` resizeMode="contain" source={ Object { - "headers": Object { - "Authorization": "Bearer ", - }, "uri": "https://images.com/image.png", } } diff --git a/app/components/progressive_image/progressive_image.js b/app/components/progressive_image/progressive_image.js index 62794fc07..afc40a3bf 100644 --- a/app/components/progressive_image/progressive_image.js +++ b/app/components/progressive_image/progressive_image.js @@ -75,10 +75,9 @@ export default class ProgressiveImage extends PureComponent { load = () => { const {imageUri, thumbnailUri} = this.props; - const headers = {Authorization: `Bearer ${Client4.getToken()}`}; if (thumbnailUri && imageUri) { - FastImage.preload([{uri: imageUri, headers}]); + FastImage.preload([{uri: imageUri}]); this.setThumbnail(thumbnailUri); } else if (imageUri) { this.setImage(imageUri); @@ -184,11 +183,10 @@ export default class ProgressiveImage extends PureComponent { } let source; - const headers = {Authorization: `Bearer ${Client4.getToken()}`}; if (hasPreview && !isImageReady) { - source = {uri: thumb, headers}; + source = {uri: thumb}; } else if (isImageReady) { - source = {uri, headers}; + source = {uri}; } return ( diff --git a/app/mattermost.js b/app/mattermost.js index 2580e975d..ea6e5e2a0 100644 --- a/app/mattermost.js +++ b/app/mattermost.js @@ -22,6 +22,7 @@ import store, {persistor} from 'app/store'; import {waitForHydration} from 'app/store/utils'; import EphemeralStore from 'app/store/ephemeral_store'; import telemetry from 'app/telemetry'; +import {validatePreviousVersion} from 'app/utils/general'; import pushNotificationsUtils from 'app/utils/push_notifications'; const init = async () => { @@ -52,8 +53,10 @@ const launchApp = (credentials) => { if (credentials) { waitForHydration(store, async () => { - store.dispatch(loadMe()); - resetToChannel({skipMetrics: true}); + if (validatePreviousVersion(store, EphemeralStore.prevAppVersion)) { + store.dispatch(loadMe()); + resetToChannel({skipMetrics: true}); + } }); } else { resetToSelectServer(emmProvider.allowOtherServers); diff --git a/app/store/middleware.js b/app/store/middleware.js index 75c624d2c..cf6dfdf52 100644 --- a/app/store/middleware.js +++ b/app/store/middleware.js @@ -4,9 +4,11 @@ import {Platform} from 'react-native'; import DeviceInfo from 'react-native-device-info'; import {REHYDRATE} from 'redux-persist'; +import semver from 'semver/preload'; import {ViewTypes} from 'app/constants'; import initialState from 'app/initial_state'; +import EphemeralStore from 'app/store/ephemeral_store'; import {throttle} from 'app/utils/general'; import mattermostBucket from 'app/mattermost_bucket'; @@ -98,12 +100,18 @@ async function saveStateToFile(store) { function messageRetention(store) { return (next) => (action) => { if (action.type === REHYDRATE) { - // On first run payload is not set (when installed) if (!action.payload) { + // On first run payload is not set (when installed) + const version = DeviceInfo.getVersion(); + const major = semver.major(version); + const minor = semver.minor(version); + const patch = semver.patch(version); + const prevAppVersion = `${major}.${parseInt(minor, 10) - 1}.${patch}`; + EphemeralStore.prevAppVersion = prevAppVersion; action.payload = { app: { build: DeviceInfo.getBuildNumber(), - version: DeviceInfo.getVersion(), + version, }, views: { root: { @@ -116,6 +124,10 @@ function messageRetention(store) { const {app} = action.payload; const {entities, views} = action.payload; + if (!EphemeralStore.prevAppVersion) { + EphemeralStore.prevAppVersion = app?.version; + } + if (!entities || !views) { return next(action); } diff --git a/app/utils/general.js b/app/utils/general.js index c3c3d540c..b84325c15 100644 --- a/app/utils/general.js +++ b/app/utils/general.js @@ -6,6 +6,10 @@ import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import {Posts} from '@mm-redux/constants'; +import {logout} from 'app/actions/views/user'; + +const INVALID_VERSIONS = ['1.29.0']; + export function fromAutoResponder(post) { return Boolean(post.type && (post.type === Posts.SYSTEM_AUTO_RESPONDER)); } @@ -81,4 +85,13 @@ export function throttle(fn, limit, ...args) { export function isPendingPost(postId, userId) { return postId.startsWith(userId); +} + +export function validatePreviousVersion(store, version) { + if (INVALID_VERSIONS.includes(version)) { + store.dispatch(logout()); + return false; + } + + return true; } \ No newline at end of file diff --git a/patches/react-native-fast-image+8.1.5.patch b/patches/react-native-fast-image+8.1.5.patch new file mode 100644 index 000000000..ba6b38a40 --- /dev/null +++ b/patches/react-native-fast-image+8.1.5.patch @@ -0,0 +1,56 @@ +diff --git a/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageCookieJar.java b/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageCookieJar.java +new file mode 100644 +index 0000000..f2306f6 +--- /dev/null ++++ b/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageCookieJar.java +@@ -0,0 +1,38 @@ ++package com.dylanvann.fastimage; ++ ++import android.webkit.CookieManager; ++ ++import java.util.Collections; ++import java.util.List; ++ ++import okhttp3.Cookie; ++import okhttp3.CookieJar; ++import okhttp3.HttpUrl; ++ ++public class FastImageCookieJar implements CookieJar { ++ private CookieManager cookieManager; ++ ++ private CookieManager getCookieManager() { ++ if (cookieManager == null) { ++ cookieManager = CookieManager.getInstance(); ++ } ++ ++ return cookieManager; ++ } ++ ++ @Override ++ public void saveFromResponse(HttpUrl url, List cookies) { ++ // Do nothing ++ } ++ ++ @Override ++ public List loadForRequest(HttpUrl url) { ++ String cookie = getCookieManager().getCookie(url.toString()); ++ ++ if (cookie == null || cookie.isEmpty()) { ++ return Collections.emptyList(); ++ } ++ ++ return Collections.singletonList(Cookie.parse(url, cookie)); ++ } ++} +diff --git a/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageOkHttpProgressGlideModule.java b/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageOkHttpProgressGlideModule.java +index 2214f04..bfb9895 100644 +--- a/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageOkHttpProgressGlideModule.java ++++ b/node_modules/react-native-fast-image/android/src/main/java/com/dylanvann/fastimage/FastImageOkHttpProgressGlideModule.java +@@ -45,6 +45,7 @@ public class FastImageOkHttpProgressGlideModule extends LibraryGlideModule { + OkHttpClient client = OkHttpClientProvider + .getOkHttpClient() + .newBuilder() ++ .cookieJar(new FastImageCookieJar()) + .addInterceptor(createInterceptor(progressListener)) + .build(); + OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(client);