Browse Source

Merge pull request #902 from gre/fix-error-imprecision

Fix error imprecision in all Manager calls
master
Gaëtan Renaudeau 7 years ago
committed by GitHub
parent
commit
5c52d3b33d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      src/helpers/apps/listAppVersions.js
  2. 10
      src/helpers/apps/listApps.js
  3. 10
      src/helpers/apps/listCategories.js
  4. 66
      src/helpers/common.js
  5. 27
      src/helpers/devices/getCurrentFirmware.js
  6. 78
      src/helpers/devices/getLatestFirmwareForDevice.js
  7. 16
      src/helpers/devices/isDashboardOpen.js
  8. 74
      src/helpers/devices/shouldFlashMcu.js
  9. 16
      src/helpers/firmware/getMcus.js
  10. 30
      src/helpers/firmware/getNextMCU.js
  11. 2
      src/helpers/urls.js

34
src/helpers/apps/listAppVersions.js

@ -7,25 +7,19 @@ import getDeviceVersion from 'helpers/devices/getDeviceVersion'
import getCurrentFirmware from 'helpers/devices/getCurrentFirmware' import getCurrentFirmware from 'helpers/devices/getCurrentFirmware'
export default async (deviceInfo: DeviceInfo) => { export default async (deviceInfo: DeviceInfo) => {
try { const deviceData = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId)
const deviceData = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId) const firmwareData = await getCurrentFirmware({
const firmwareData = await getCurrentFirmware({ deviceId: deviceData.id,
deviceId: deviceData.id, fullVersion: deviceInfo.fullVersion,
fullVersion: deviceInfo.fullVersion, provider: deviceInfo.providerId,
provider: deviceInfo.providerId, })
}) const params = {
const params = { provider: deviceInfo.providerId,
provider: deviceInfo.providerId, current_se_firmware_final_version: firmwareData.id,
current_se_firmware_final_version: firmwareData.id, device_version: deviceData.id,
device_version: deviceData.id,
}
const {
data: { application_versions },
} = await network({ method: 'POST', url: APPLICATIONS_BY_DEVICE, data: params })
return application_versions.length > 0 ? application_versions : []
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
} }
const {
data: { application_versions },
} = await network({ method: 'POST', url: APPLICATIONS_BY_DEVICE, data: params })
return application_versions.length > 0 ? application_versions : []
} }

10
src/helpers/apps/listApps.js

@ -4,12 +4,6 @@ import network from 'api/network'
import { GET_APPLICATIONS } from 'helpers/urls' import { GET_APPLICATIONS } from 'helpers/urls'
export default async () => { export default async () => {
try { const { data } = await network({ method: 'GET', url: GET_APPLICATIONS })
const { data } = await network({ method: 'GET', url: GET_APPLICATIONS }) return data.length > 0 ? data : []
return data.length > 0 ? data : []
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
}
} }

10
src/helpers/apps/listCategories.js

@ -4,12 +4,6 @@ import network from 'api/network'
import { GET_CATEGORIES } from 'helpers/urls' import { GET_CATEGORIES } from 'helpers/urls'
export default async () => { export default async () => {
try { const { data } = await network({ method: 'GET', url: GET_CATEGORIES })
const { data } = await network({ method: 'GET', url: GET_CATEGORIES }) return data.length > 0 ? data : []
return data.length > 0 ? data : []
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
}
} }

66
src/helpers/common.js

@ -27,44 +27,38 @@ export type LedgerScriptParams = {
* Retrieve targetId and firmware version from device * Retrieve targetId and firmware version from device
*/ */
export async function getFirmwareInfo(transport: Transport<*>) { export async function getFirmwareInfo(transport: Transport<*>) {
try { const res = await transport.send(...APDUS.GET_FIRMWARE)
const res = await transport.send(...APDUS.GET_FIRMWARE) const byteArray = [...res]
const byteArray = [...res] const data = byteArray.slice(0, byteArray.length - 2)
const data = byteArray.slice(0, byteArray.length - 2) const targetIdStr = Buffer.from(data.slice(0, 4))
const targetIdStr = Buffer.from(data.slice(0, 4)) const targetId = targetIdStr.readUIntBE(0, 4)
const targetId = targetIdStr.readUIntBE(0, 4) const seVersionLength = data[4]
const seVersionLength = data[4] const seVersion = Buffer.from(data.slice(5, 5 + seVersionLength)).toString()
const seVersion = Buffer.from(data.slice(5, 5 + seVersionLength)).toString() const flagsLength = data[5 + seVersionLength]
const flagsLength = data[5 + seVersionLength] const flags = Buffer.from(
const flags = Buffer.from( data.slice(5 + seVersionLength + 1, 5 + seVersionLength + 1 + flagsLength),
data.slice(5 + seVersionLength + 1, 5 + seVersionLength + 1 + flagsLength), ).toString()
).toString()
const mcuVersionLength = data[5 + seVersionLength + 1 + flagsLength] const mcuVersionLength = data[5 + seVersionLength + 1 + flagsLength]
let mcuVersion = Buffer.from( let mcuVersion = Buffer.from(
data.slice( data.slice(
7 + seVersionLength + flagsLength, 7 + seVersionLength + flagsLength,
7 + seVersionLength + flagsLength + mcuVersionLength, 7 + seVersionLength + flagsLength + mcuVersionLength,
), ),
) )
if (mcuVersion[mcuVersion.length - 1] === 0) { if (mcuVersion[mcuVersion.length - 1] === 0) {
mcuVersion = mcuVersion.slice(0, mcuVersion.length - 1) mcuVersion = mcuVersion.slice(0, mcuVersion.length - 1)
} }
mcuVersion = mcuVersion.toString() mcuVersion = mcuVersion.toString()
if (!seVersionLength) { if (!seVersionLength) {
return { return {
targetId, targetId,
seVersion: '0.0.0', seVersion: '0.0.0',
flags: '', flags: '',
mcuVersion: '', mcuVersion: '',
}
} }
return { targetId, seVersion, flags, mcuVersion }
} catch (err) {
const error = new Error(err.message)
error.stack = err.stack
throw error
} }
return { targetId, seVersion, flags, mcuVersion }
} }

27
src/helpers/devices/getCurrentFirmware.js

@ -9,22 +9,15 @@ type Input = {
provider: number, provider: number,
} }
let error
export default async (input: Input): Promise<*> => { export default async (input: Input): Promise<*> => {
try { const { data } = await network({
const { data } = await network({ method: 'POST',
method: 'POST', url: GET_CURRENT_FIRMWARE,
url: GET_CURRENT_FIRMWARE, data: {
data: { device_version: input.deviceId,
device_version: input.deviceId, version_name: input.fullVersion,
version_name: input.fullVersion, provider: input.provider,
provider: input.provider, },
}, })
}) return data
return data
} catch (err) {
error = Error(err.message)
error.stack = err.stack
throw error
}
} }

78
src/helpers/devices/getLatestFirmwareForDevice.js

@ -10,53 +10,47 @@ import getCurrentFirmware from './getCurrentFirmware'
import getDeviceVersion from './getDeviceVersion' import getDeviceVersion from './getDeviceVersion'
export default async (deviceInfo: DeviceInfo) => { export default async (deviceInfo: DeviceInfo) => {
try { // Get device infos from targetId
// Get device infos from targetId const deviceVersion = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId)
const deviceVersion = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId)
// Get firmware infos with firmware name and device version
// Get firmware infos with firmware name and device version const seFirmwareVersion = await getCurrentFirmware({
const seFirmwareVersion = await getCurrentFirmware({ fullVersion: deviceInfo.fullVersion,
fullVersion: deviceInfo.fullVersion, deviceId: deviceVersion.id,
deviceId: deviceVersion.id, provider: deviceInfo.providerId,
})
// Fetch next possible firmware
const { data } = await network({
method: 'POST',
url: GET_LATEST_FIRMWARE,
data: {
current_se_firmware_final_version: seFirmwareVersion.id,
device_version: deviceVersion.id,
provider: deviceInfo.providerId, provider: deviceInfo.providerId,
}) },
})
// Fetch next possible firmware
const { data } = await network({
method: 'POST',
url: GET_LATEST_FIRMWARE,
data: {
current_se_firmware_final_version: seFirmwareVersion.id,
device_version: deviceVersion.id,
provider: deviceInfo.providerId,
},
})
if (data.result === 'null') {
return null
}
const { se_firmware_osu_version } = data if (data.result === 'null') {
const { next_se_firmware_final_version } = se_firmware_osu_version return null
const seFirmwareFinalVersion = await getFinalFirmwareById(next_se_firmware_final_version) }
const mcus = await getMcus() const { se_firmware_osu_version } = data
const { next_se_firmware_final_version } = se_firmware_osu_version
const seFirmwareFinalVersion = await getFinalFirmwareById(next_se_firmware_final_version)
const currentMcuVersionId = mcus const mcus = await getMcus()
.filter(mcu => mcu.name === deviceInfo.mcuVersion)
.map(mcu => mcu.id)
if (!seFirmwareFinalVersion.mcu_versions.includes(...currentMcuVersionId)) { const currentMcuVersionId = mcus
return { .filter(mcu => mcu.name === deviceInfo.mcuVersion)
...se_firmware_osu_version, .map(mcu => mcu.id)
shouldFlashMcu: true,
}
}
return { ...se_firmware_osu_version, shouldFlashMcu: false } if (!seFirmwareFinalVersion.mcu_versions.includes(...currentMcuVersionId)) {
} catch (err) { return {
const error = Error(err.message) ...se_firmware_osu_version,
error.stack = err.stack shouldFlashMcu: true,
throw error }
} }
return { ...se_firmware_osu_version, shouldFlashMcu: false }
} }

16
src/helpers/devices/isDashboardOpen.js

@ -7,16 +7,10 @@ import { getFirmwareInfo } from 'helpers/common'
type Result = boolean type Result = boolean
export default async (transport: Transport<*>): Promise<Result> => { export default async (transport: Transport<*>): Promise<Result> => {
try { const { targetId, seVersion } = await getFirmwareInfo(transport)
const { targetId, seVersion } = await getFirmwareInfo(transport) if (targetId && seVersion) {
if (targetId && seVersion) { return true
return true
}
return false
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw error
} }
return false
} }

74
src/helpers/devices/shouldFlashMcu.js

@ -10,46 +10,40 @@ import getOsuFirmware from './getOsuFirmware'
import getDeviceVersion from './getDeviceVersion' import getDeviceVersion from './getDeviceVersion'
export default async (deviceInfo: DeviceInfo): Promise<boolean> => { export default async (deviceInfo: DeviceInfo): Promise<boolean> => {
try { // Get device infos from targetId
// Get device infos from targetId const deviceVersion = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId)
const deviceVersion = await getDeviceVersion(deviceInfo.targetId, deviceInfo.providerId)
// Get firmware infos with firmware name and device version
// Get firmware infos with firmware name and device version const seFirmwareVersion = await getOsuFirmware({
const seFirmwareVersion = await getOsuFirmware({ version: deviceInfo.fullVersion,
version: deviceInfo.fullVersion, deviceId: deviceVersion.id,
deviceId: deviceVersion.id, provider: deviceInfo.providerId,
})
// Fetch next possible firmware
const { data } = await network({
method: 'POST',
url: GET_LATEST_FIRMWARE,
data: {
current_se_firmware_final_version: seFirmwareVersion.id,
device_version: deviceVersion.id,
provider: deviceInfo.providerId, provider: deviceInfo.providerId,
}) },
})
// Fetch next possible firmware
const { data } = await network({ if (data.result === 'null') {
method: 'POST', return false
url: GET_LATEST_FIRMWARE,
data: {
current_se_firmware_final_version: seFirmwareVersion.id,
device_version: deviceVersion.id,
provider: deviceInfo.providerId,
},
})
if (data.result === 'null') {
return false
}
const { se_firmware_osu_version } = data
const { next_se_firmware_final_version } = se_firmware_osu_version
const seFirmwareFinalVersion = await getFinalFirmwareById(next_se_firmware_final_version)
const mcus = await getMcus()
const currentMcuVersionId = mcus
.filter(mcu => mcu.name === deviceInfo.mcuVersion)
.map(mcu => mcu.id)
return !seFirmwareFinalVersion.mcu_versions.includes(...currentMcuVersionId)
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw error
} }
const { se_firmware_osu_version } = data
const { next_se_firmware_final_version } = se_firmware_osu_version
const seFirmwareFinalVersion = await getFinalFirmwareById(next_se_firmware_final_version)
const mcus = await getMcus()
const currentMcuVersionId = mcus
.filter(mcu => mcu.name === deviceInfo.mcuVersion)
.map(mcu => mcu.id)
return !seFirmwareFinalVersion.mcu_versions.includes(...currentMcuVersionId)
} }

16
src/helpers/firmware/getMcus.js

@ -4,16 +4,10 @@ import network from 'api/network'
import { GET_MCUS } from 'helpers/urls' import { GET_MCUS } from 'helpers/urls'
export default async (): Promise<*> => { export default async (): Promise<*> => {
try { const { data } = await network({
const { data } = await network({ method: 'GET',
method: 'GET', url: GET_MCUS,
url: GET_MCUS, })
})
return data return data
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
}
} }

30
src/helpers/firmware/getNextMCU.js

@ -7,24 +7,18 @@ import { createCustomErrorClass } from 'helpers/errors'
const LatestMCUInstalledError = createCustomErrorClass('LatestMCUInstalledError') const LatestMCUInstalledError = createCustomErrorClass('LatestMCUInstalledError')
export default async (bootloaderVersion: string): Promise<*> => { export default async (bootloaderVersion: string): Promise<*> => {
try { const { data } = await network({
const { data } = await network({ method: 'POST',
method: 'POST', url: GET_NEXT_MCU,
url: GET_NEXT_MCU, data: {
data: { bootloader_version: bootloaderVersion,
bootloader_version: bootloaderVersion, },
}, })
})
// FIXME: nextVersion will not be able to "default" when // FIXME: nextVersion will not be able to "default" when
// Error handling is standardize on the API side // Error handling is standardize on the API side
if (data === 'default' || !data.name) { if (data === 'default' || !data.name) {
throw new LatestMCUInstalledError('there is no next mcu version to install') throw new LatestMCUInstalledError('there is no next mcu version to install')
}
return data
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
} }
return data
} }

2
src/helpers/urls.js

@ -14,6 +14,8 @@ const wsURLBuilder = (endpoint: string) => (params?: Object) =>
// const wsURLBuilderProxy = (endpoint: string) => (params?: Object) => // const wsURLBuilderProxy = (endpoint: string) => (params?: Object) =>
// `ws://manager.ledger.fr:3501/${endpoint}${params ? `?${qs.stringify(params)}` : ''}` // `ws://manager.ledger.fr:3501/${endpoint}${params ? `?${qs.stringify(params)}` : ''}`
// FIXME we shouldn't do this here. we should just collocate these where it's used.
export const GET_FINAL_FIRMWARE: string = managerUrlbuilder('firmware_final_versions') export const GET_FINAL_FIRMWARE: string = managerUrlbuilder('firmware_final_versions')
export const GET_DEVICE_VERSION: string = managerUrlbuilder('get_device_version') export const GET_DEVICE_VERSION: string = managerUrlbuilder('get_device_version')
export const APPLICATIONS_BY_DEVICE: string = managerUrlbuilder('get_apps') export const APPLICATIONS_BY_DEVICE: string = managerUrlbuilder('get_apps')

Loading…
Cancel
Save