Browse Source

added fetch last firmware, get device infos and get current firmare commands

master
Valentin D. Pinkman 7 years ago
parent
commit
e352ffad66
No known key found for this signature in database GPG Key ID: E7D110669FFB8D3E
  1. 19
      src/commands/getCurrentFirmware.js
  2. 19
      src/commands/getFirmwareInfo.js
  3. 4
      src/commands/index.js
  4. 4
      src/components/ManagerPage/Dashboard.js
  5. 4
      src/components/ManagerPage/FirmwareUpdate.js
  6. 5
      src/components/ManagerPage/UpdateFirmwareButton.js
  7. 15
      src/components/TriggerOnMount/index.js
  8. 20
      src/helpers/apps/listApps.js
  9. 41
      src/helpers/common.js
  10. 26
      src/helpers/devices/getCurrentFirmware.js
  11. 19
      src/helpers/devices/getDeviceVersion.js
  12. 34
      src/helpers/devices/getFirmwareInfo.js
  13. 5
      src/helpers/devices/getIsGenuine.js
  14. 37
      src/helpers/devices/getLatestFirmwareForDevice.js
  15. 7
      src/helpers/devices/getMemInfo.js
  16. 9
      src/helpers/firmware/installFinalFirmware.js
  17. 9
      src/helpers/firmware/installOsuFirmware.js
  18. 15
      src/helpers/urls.js

19
src/commands/getCurrentFirmware.js

@ -0,0 +1,19 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import getCurrentFirmware from 'helpers/devices/getCurrentFirmware'
type Input = {
deviceId: string | number,
version: string,
}
type Result = *
const cmd: Command<Input, Result> = createCommand('getCurrentFirmware', data =>
fromPromise(getCurrentFirmware(data)),
)
export default cmd

19
src/commands/getFirmwareInfo.js

@ -1,19 +0,0 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import getFirmwareInfo from 'helpers/devices/getFirmwareInfo'
type Input = {
targetId: string | number,
version: string,
}
type Result = *
const cmd: Command<Input, Result> = createCommand('getFirmwareInfo', data =>
fromPromise(getFirmwareInfo(data)),
)
export default cmd

4
src/commands/index.js

@ -5,7 +5,7 @@ import type { Command } from 'helpers/ipc'
import getAddress from 'commands/getAddress'
import getDeviceInfo from 'commands/getDeviceInfo'
import getFirmwareInfo from 'commands/getFirmwareInfo'
import getCurrentFirmware from 'commands/getCurrentFirmware'
import getIsGenuine from 'commands/getIsGenuine'
import getLatestFirmwareForDevice from 'commands/getLatestFirmwareForDevice'
import getMemInfo from 'commands/getMemInfo'
@ -32,7 +32,7 @@ import uninstallApp from 'commands/uninstallApp'
const all: Array<Command<any, any>> = [
getAddress,
getDeviceInfo,
getFirmwareInfo,
getCurrentFirmware,
getIsGenuine,
getLatestFirmwareForDevice,
getMemInfo,

4
src/components/ManagerPage/Dashboard.js

@ -34,13 +34,13 @@ const Dashboard = ({ device, deviceInfo, t }: Props) => (
</Text>
</Box>
<Box mt={5}>
{/* <FirmwareUpdate
<FirmwareUpdate
infos={{
targetId: deviceInfo.targetId,
version: deviceInfo.version,
}}
device={device}
/> */}
/>
</Box>
<Box mt={5}>
<AppsList device={device} targetId={deviceInfo.targetId} version={deviceInfo.version} />

4
src/components/ManagerPage/FirmwareUpdate.js

@ -119,7 +119,9 @@ class FirmwareUpdate extends PureComponent<Props, State> {
</Box>
</Box>
<Text ff="Open Sans|SemiBold" fontSize={2}>
{t('app:manager.firmware.installed', { version: infos.version })}
{t('app:manager.firmware.installed', {
version: infos.version,
})}
</Text>
</Box>
<UpdateFirmwareButton firmware={latestFirmware} installFirmware={this.installFirmware} />

5
src/components/ManagerPage/UpdateFirmwareButton.js

@ -18,11 +18,14 @@ type Props = {
installFirmware: () => void,
}
const getCleanVersion = (input: string): string =>
input.endsWith('-osu') ? input.replace('-osu', '') : input
const UpdateFirmwareButton = ({ t, firmware, installFirmware }: Props) =>
firmware ? (
<Fragment>
<Text ff="Open Sans|Regular" fontSize={4} style={{ marginLeft: 'auto', marginRight: 15 }}>
{t('app:manager.firmware.latest', { version: firmware.name })}
{t('app:manager.firmware.latest', { version: getCleanVersion(firmware.name) })}
</Text>
<Button primary onClick={installFirmware}>
{t('app:manager.firmware.update')}

15
src/components/TriggerOnMount/index.js

@ -1,15 +0,0 @@
// @flow
import { PureComponent } from 'react'
type Props = {
callback: () => void,
}
class TriggerOnMount extends PureComponent<Props> {
componentDidMount() {
const { callback } = this.props
callback()
}
}
export default TriggerOnMount

20
src/helpers/apps/listApps.js

@ -1,27 +1,19 @@
// @flow
import axios from 'axios'
import {
DEVICE_VERSION_BY_TARGET_ID,
APPLICATIONS_BY_DEVICE,
FIRMWARE_FINAL_VERSIONS_NAME,
} from 'helpers/urls'
import { APPLICATIONS_BY_DEVICE } from 'helpers/urls'
import getDeviceVersion from 'helpers/devices/getDeviceVersion'
import getCurrentFirmware from 'helpers/devices/getCurrentFirmware'
export default async (targetId: string | number, version: string) => {
try {
const provider = 1
const { data: deviceData } = await axios.post(DEVICE_VERSION_BY_TARGET_ID, {
provider,
target_id: targetId,
})
const { data: firmwareData } = await axios.post(FIRMWARE_FINAL_VERSIONS_NAME, {
device_version: deviceData.id,
se_firmware_name: version,
})
const deviceData = await getDeviceVersion(targetId)
const firmwareData = await getCurrentFirmware({ deviceId: deviceData.id, version })
const {
data: { application_versions },
} = await axios.post(APPLICATIONS_BY_DEVICE, {
providers: [1],
provider,
current_se_firmware_final_version: firmwareData.id,
device_version: deviceData.id,
})

41
src/helpers/common.js

@ -1,11 +1,7 @@
// @flow
// FIXME remove this file! 'helpers/common.js' RLY? :P
import qs from 'qs'
import type Transport from '@ledgerhq/hw-transport'
import { BASE_SOCKET_URL, BASE_SOCKET_URL_SECURE } from 'config/constants'
import { createDeviceSocket } from './socket'
const APDUS = {
GET_FIRMWARE: [0xe0, 0x01, 0x00, 0x00],
@ -26,31 +22,6 @@ export type LedgerScriptParams = {
app?: number,
}
type FirmwareUpdateType = 'osu' | 'final'
export async function getMemInfos(transport: Transport<*>): Promise<Object> {
const { targetId } = await getFirmwareInfo(transport)
// Dont ask me about this `perso_11`: I don't know. But we need it.
return createSocketDialog(transport, '/get-mem-infos', { targetId, perso: 'perso_11' })
}
/**
* Open socket connection with firmware api, and init a dialog
* with the device
*/
export async function createSocketDialog(
transport: Transport<*>,
endpoint: string,
params: LedgerScriptParams,
managerUrl: boolean = false,
): Promise<string> {
console.warn('DEPRECATED createSocketDialog: use createDeviceSocket') // eslint-disable-line
const url = `${managerUrl ? BASE_SOCKET_URL_SECURE : BASE_SOCKET_URL}${endpoint}?${qs.stringify(
params,
)}`
return createDeviceSocket(transport, url).toPromise()
}
/**
* Retrieve targetId and firmware version from device
*/
@ -70,15 +41,3 @@ export async function getFirmwareInfo(transport: Transport<*>) {
throw error
}
}
/**
* Helpers to build OSU and Final firmware params
*/
export const buildParamsFromFirmware = (type: FirmwareUpdateType): Function => (
data: any,
): LedgerScriptParams => ({
firmware: data[`${type}_firmware`],
firmwareKey: data[`${type}_firmware_key`],
perso: data[`${type}_perso`],
targetId: data[`${type}_target_id`],
})

26
src/helpers/devices/getCurrentFirmware.js

@ -0,0 +1,26 @@
// @flow
import axios from 'axios'
import { GET_CURRENT_FIRMWARE } from 'helpers/urls'
type Input = {
version: string,
deviceId: string | number,
}
let error
export default async (input: Input): Promise<*> => {
try {
const provider = 1
const { data } = await axios.post(GET_CURRENT_FIRMWARE, {
device_version: input.deviceId,
version_name: input.version,
provider,
})
return data
} catch (err) {
error = Error(err.message)
error.stack = err.stack
throw error
}
}

19
src/helpers/devices/getDeviceVersion.js

@ -0,0 +1,19 @@
// @flow
import axios from 'axios'
import { GET_DEVICE_VERSION } from 'helpers/urls'
export default async (targetId: string | number): Promise<*> => {
try {
const provider = 1
const { data } = await axios.post(GET_DEVICE_VERSION, {
provider,
target_id: targetId,
})
return data
} catch (err) {
const error = Error(err.message)
error.stack = err.stack
throw err
}
}

34
src/helpers/devices/getFirmwareInfo.js

@ -1,34 +0,0 @@
// @flow
import axios from 'axios'
import isEmpty from 'lodash/isEmpty'
import { MANAGER_API_BASE } from 'config/constants'
type Input = {
version: string,
targetId: string | number,
}
let error
export default async (data: Input) => {
try {
const { data: seFirmwareVersion } = await axios.post(
`${MANAGER_API_BASE}/firmware_versions_name`,
{
se_firmware_name: data.version,
target_id: data.targetId,
},
)
if (!isEmpty(seFirmwareVersion)) {
return seFirmwareVersion
}
error = Error('could not retrieve firmware informations, try again later')
throw error
} catch (err) {
error = Error(err.message)
error.stack = err.stack
throw error
}
}

5
src/helpers/devices/getIsGenuine.js

@ -1,7 +1,8 @@
// @flow
import qs from 'qs'
import type Transport from '@ledgerhq/hw-transport'
import { SKIP_GENUINE, BASE_SOCKET_URL_SECURE } from 'config/constants'
import { SKIP_GENUINE } from 'config/constants'
import { WS_GENUINE } from 'helpers/urls'
import { createDeviceSocket } from 'helpers/socket'
@ -9,7 +10,7 @@ export default async (
transport: Transport<*>,
params: { targetId: string | number },
): Promise<string> => {
const url = `${BASE_SOCKET_URL_SECURE}/genuine?${qs.stringify(params)}`
const url = WS_GENUINE(params)
return SKIP_GENUINE
? new Promise(resolve => setTimeout(() => resolve('0000'), 1000))
: createDeviceSocket(transport, url).toPromise()

37
src/helpers/devices/getLatestFirmwareForDevice.js

@ -1,39 +1,38 @@
// @flow
import axios from 'axios'
import isEmpty from 'lodash/isEmpty'
import { MANAGER_API_BASE } from 'config/constants'
import { GET_LATEST_FIRMWARE } from 'helpers/urls'
import getFirmwareInfo from './getFirmwareInfo'
import getCurrentFirmware from './getCurrentFirmware'
import getDeviceVersion from './getDeviceVersion'
type Input = {
targetId: string | number,
version: string,
targetId: string | number,
}
export default async (data: Input) => {
export default async (input: Input) => {
try {
// Get firmware infos with firmware name and device version
const seFirmwareVersion = await getFirmwareInfo(data)
const provider = 1
const { targetId, version } = input
// Get device infos from targetId
const { data: deviceVersion } = await axios.get(
`${MANAGER_API_BASE}/device_versions_target_id/${data.targetId}`,
)
const deviceVersion = await getDeviceVersion(targetId)
// Get firmware infos with firmware name and device version
const seFirmwareVersion = await getCurrentFirmware({ version, deviceId: deviceVersion.id })
// Fetch next possible firmware
const { data: serverData } = await axios.post(`${MANAGER_API_BASE}/get_latest_firmware`, {
current_se_firmware_version: seFirmwareVersion.id,
const { data } = await axios.post(GET_LATEST_FIRMWARE, {
current_se_firmware_final_version: seFirmwareVersion.id,
device_version: deviceVersion.id,
providers: [1],
provider,
})
const { se_firmware_version } = serverData
if (!isEmpty(se_firmware_version)) {
return se_firmware_version
if (data.result === 'null') {
return null
}
return null
const { se_firmware_osu_version } = data
return se_firmware_osu_version
} catch (err) {
const error = Error(err.message)
error.stack = err.stack

7
src/helpers/devices/getMemInfo.js

@ -2,10 +2,9 @@
import type Transport from '@ledgerhq/hw-transport'
import { getFirmwareInfo, createSocketDialog } from 'helpers/common'
import { getFirmwareInfo } from 'helpers/common'
export default async function getMemInfos(transport: Transport<*>): Promise<Object> {
const { targetId } = await getFirmwareInfo(transport)
// Dont ask me about this `perso_11`: I don't know. But we need it.
return createSocketDialog(transport, '/get-mem-infos', { targetId, perso: 'perso_11' })
const { targetId } = await getFirmwareInfo(transport) // eslint-disable-line
return new Promise(resolve => setTimeout(() => resolve({}), 1000))
}

9
src/helpers/firmware/installFinalFirmware.js

@ -1,20 +1,15 @@
// @flow
import qs from 'qs'
import type Transport from '@ledgerhq/hw-transport'
import { BASE_SOCKET_URL_SECURE } from 'config/constants'
import { WS_INSTALL } from 'helpers/urls'
import { createDeviceSocket } from 'helpers/socket'
import { buildParamsFromFirmware } from 'helpers/common'
type Input = Object
type Result = *
const buildFinalParams = buildParamsFromFirmware('final')
export default async (transport: Transport<*>, firmware: Input): Result => {
try {
const finalData = buildFinalParams(firmware)
const url = `${BASE_SOCKET_URL_SECURE}/install?${qs.stringify(finalData)}`
const url = WS_INSTALL(firmware)
await createDeviceSocket(transport, url).toPromise()
return { success: true }
} catch (err) {

9
src/helpers/firmware/installOsuFirmware.js

@ -1,21 +1,16 @@
// @flow
import qs from 'qs'
import type Transport from '@ledgerhq/hw-transport'
import { BASE_SOCKET_URL_SECURE } from 'config/constants'
import { WS_INSTALL } from 'helpers/urls'
import { createDeviceSocket } from 'helpers/socket'
import { buildParamsFromFirmware } from 'helpers/common'
type Input = Object
type Result = Promise<{ success: boolean, error?: any }>
const buildOsuParams = buildParamsFromFirmware('osu')
export default async (transport: Transport<*>, firmware: Input): Result => {
try {
const osuData = buildOsuParams(firmware)
const url = `${BASE_SOCKET_URL_SECURE}/install?${qs.stringify(osuData)}`
const url = WS_INSTALL(firmware)
await createDeviceSocket(transport, url).toPromise()
return { success: true }
} catch (err) {

15
src/helpers/urls.js

@ -2,17 +2,20 @@
import qs from 'qs'
import { MANAGER_API_BASE, BASE_SOCKET_URL_SECURE } from 'config/constants'
import type { LedgerScriptParams } from 'helpers/common'
const urlBuilder = (base: string) => (endpoint: string): string => `${base}/${endpoint}`
const managerUrlbuilder = urlBuilder(MANAGER_API_BASE)
const wsURLBuilder = (endpoint: string) => (params?: Object) =>
`${BASE_SOCKET_URL_SECURE}/${endpoint}${params ? `?${qs.stringify(params)}` : ''}`
export const DEVICE_VERSION_BY_TARGET_ID = managerUrlbuilder('device_versions_target_id')
export const APPLICATIONS_BY_DEVICE = managerUrlbuilder('get_apps')
export const FIRMWARE_FINAL_VERSIONS_NAME = managerUrlbuilder('firmware_final_versions_name')
export const GET_DEVICE_VERSION: string = managerUrlbuilder('get_device_version')
export const APPLICATIONS_BY_DEVICE: string = managerUrlbuilder('get_apps')
export const GET_CURRENT_FIRMWARE: string = managerUrlbuilder('get_firmware_version')
export const GET_LATEST_FIRMWARE: string = managerUrlbuilder('get_latest_firmware')
export const WS_INSTALL = wsURLBuilder('install')
export const WS_GENUINE = wsURLBuilder('genuine')
export const WS_MCU = wsURLBuilder('genuine')
export const WS_INSTALL: (arg: LedgerScriptParams) => string = wsURLBuilder('install')
export const WS_GENUINE: (arg: { targetId: string | number }) => string = wsURLBuilder('genuine')
export const WS_MCU: (arg: LedgerScriptParams) => string = wsURLBuilder('genuine')

Loading…
Cancel
Save