Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix App deprecation check mechanism #1358

Merged
merged 25 commits into from
Nov 12, 2019
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
df6a62e
add minVersion support to app version deprecated check
rohit-dua Oct 16, 2019
eb99e40
fix firebase requirement deprecation check"
rohit-dua Oct 16, 2019
5e698c9
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 16, 2019
4133d5d
update app check function and update firebase database rules schema
rohit-dua Oct 18, 2019
3148efe
remove stale console.logs
rohit-dua Oct 18, 2019
c2bae51
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 18, 2019
e6ed6ff
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 21, 2019
55ac623
update firebase version check function + add tests
rohit-dua Oct 21, 2019
aa98d40
Merge branch 'rohit-dua/app-version-check' of github.com:celo-org/cel…
rohit-dua Oct 21, 2019
f9436b3
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 21, 2019
31b19ac
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 22, 2019
abd8d2b
app version check remove backward compatibility
rohit-dua Oct 22, 2019
ac6f4ca
remove stale mock object
rohit-dua Oct 23, 2019
bbb0482
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 23, 2019
6cae170
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 23, 2019
38cdf8a
add non firebase check
rohit-dua Oct 23, 2019
840ad65
Merge branch 'rohit-dua/app-version-check' of github.com:celo-org/cel…
rohit-dua Oct 23, 2019
fff2516
Merge branch 'master' into rohit-dua/app-version-check
rohit-dua Oct 23, 2019
2553399
Merge branch 'rohit-dua/app-version-check' of github.com:celo-org/cel…
rohit-dua Oct 23, 2019
f8b54af
add return type to version check
rohit-dua Oct 23, 2019
ddc7be8
merge master
rohit-dua Oct 23, 2019
0e3818d
Merge branch 'master' into rohit-dua/app-version-check
jmrossy Nov 11, 2019
2dbad6b
Fix merge conflicts and simplify code
jmrossy Nov 11, 2019
89d668e
Clean up test code
jmrossy Nov 12, 2019
9c5bb54
Merge branch 'master' into rohit-dua/app-version-check
jmrossy Nov 12, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions packages/mobile/src/app/saga.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { PincodeType } from 'src/account/reducer'
import { setLanguage } from 'src/app/actions'
import { handleDappkitDeepLink } from 'src/dappkit/dappkit'
import { getVersionInfo } from 'src/firebase/firebase'
import { waitForFirebaseAuth } from 'src/firebase/saga'
import { NavActions, navigate } from 'src/navigator/NavigationService'
import { Screens, Stacks } from 'src/navigator/Screens'
import { PersistedRootState } from 'src/redux/reducers'
Expand Down Expand Up @@ -49,7 +48,6 @@ const mapStateToProps = (state: PersistedRootState): PersistedStateProps | null

export function* checkAppDeprecation() {
yield call(waitForRehydrate)
yield call(waitForFirebaseAuth)
const versionInfo = yield getVersionInfo(DeviceInfo.getVersion())
Logger.info(TAG, 'Version Info', JSON.stringify(versionInfo))
if (versionInfo && versionInfo.deprecated) {
Expand Down
6 changes: 2 additions & 4 deletions packages/mobile/src/firebase/db-rules.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@
}
},
"versions": {
"$verion_string": {
".read": true,
".write": false
}
".read": true,
".write": false
},
"lastBlockNotified": {
".read": false,
Expand Down
26 changes: 26 additions & 0 deletions packages/mobile/src/firebase/firebase.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { getNestedValue, isDeprecatedVersion } from 'src/firebase/firebase'
import { mockNestedObject } from 'test/values'

describe('Firebase version check', () => {
it('Correctly check if version is deprecated', () => {
let isDeprecated: boolean = isDeprecatedVersion('1.5.0', '1.4.0')
expect(isDeprecated).toBe(false)
isDeprecated = isDeprecatedVersion('1.4.0', '1.5.0')
expect(isDeprecated).toBe(true)
isDeprecated = isDeprecatedVersion('1.4.0', '1.4.0')
expect(isDeprecated).toBe(false)
isDeprecated = isDeprecatedVersion('1.4.0', '1.4.0.1')
expect(isDeprecated).toBe(true)
})
})

describe('Nested Object', () => {
it('Correct get nested value from an object', () => {
let value = getNestedValue(mockNestedObject, ['1', '2', '3'])
expect(value).toBe(true)
value = getNestedValue(mockNestedObject, ['1', '2', '4'])
expect(value).toBe(false)
value = getNestedValue(mockNestedObject, ['1', '2', '4', '5'])
expect(value).toBeUndefined()
})
})
56 changes: 53 additions & 3 deletions packages/mobile/src/firebase/firebase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,63 @@ export const writePaymentRequest = (paymentInfo: PaymentRequest) => async () =>
}
}

export function isDeprecatedVersion(version: string, minVersion: string): boolean {
const minVersionArray = minVersion.split('.')
const versionArray = version.split('.')
const minVersionLength = Math.min(minVersionArray.length, version.length)
for (let i = 0; i < minVersionLength; i++) {
if (minVersionArray[i] > versionArray[i]) {
return true
} else if (minVersionArray[i] < versionArray[i]) {
return false
}
}
if (minVersionArray.length > versionArray.length) {
return true
}
return false
}

export function getNestedValue(dict: object, keyList: string[]): any {
let nestedDict: any = dict
for (const key of keyList) {
if (typeof nestedDict !== 'object' || nestedDict[key] === undefined) {
return undefined
}
nestedDict = nestedDict[key]
}
return nestedDict
}

/*
Get the Version deprecation information.
@param version: string The version to check for deprecation
@return: object { version: <VERSION>, deprecated: <BOOLEAN> }
Firebase DB Format:
(Backward Compatibility) Add child to versions category in the format versions>1>5>0>{deprecated: true}
jmrossy marked this conversation as resolved.
Show resolved Hide resolved
(New) Add minVersion child to versions category with a string of the mininum version as string
*/
export async function getVersionInfo(version: string) {
jmrossy marked this conversation as resolved.
Show resolved Hide resolved
const versionFSPath = version.split('.').join('/')
let deprecated: boolean = false
Logger.info(TAG, `Checking version info ${version}`)
return (await firebase
const versionsInfo = (await firebase
jmrossy marked this conversation as resolved.
Show resolved Hide resolved
.database()
.ref(`versions/${versionFSPath}`)
.ref('versions')
.once('value')).val()
if (!versionsInfo) {
return { deprecated, version }
}
// backward compatible check
const currentVersionInfo = getNestedValue(versionsInfo, version.split('.'))
if (currentVersionInfo && currentVersionInfo.deprecated !== undefined) {
return currentVersionInfo
}
if (!versionsInfo.minVersion) {
return { version, deprecated }
}
const minVersion: string = versionsInfo.minVersion
deprecated = isDeprecatedVersion(version, minVersion)
return { version, deprecated }
}

export async function setUserLanguage(address: string, language: string) {
Expand Down
1 change: 0 additions & 1 deletion packages/mobile/src/firebase/saga.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ export function* waitForFirebaseAuth() {

function* initializeFirebase() {
const address = yield call(getAccount)

if (!FIREBASE_ENABLED) {
Logger.info(TAG, 'Firebase disabled')
yield put(showError(ErrorMessages.FIREBASE_DISABLED))
Expand Down
1 change: 1 addition & 0 deletions packages/mobile/test/values.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export const mockE164Number2 = '+12095559790'
export const mockDisplayNumber2 = '(209) 555-9790'
export const mockComment = 'Rent request for June, it is already late!!!'
export const mockCountryCode = '+1'
export const mockNestedObject = { '1': { '2': { '3': true, '4': false } } }
jmrossy marked this conversation as resolved.
Show resolved Hide resolved

export const mockQrCodeData = `{"address":"${mockAccount}","e164PhoneNumber":"${mockE164Number}","displayName":"${mockName}"}`

Expand Down