Browse Source

add genuine check call

master
Valentin D. Pinkman 7 years ago
parent
commit
7a4a2ebbfa
No known key found for this signature in database GPG Key ID: E7D110669FFB8D3E
  1. 7
      src/commands/getIsGenuine.js
  2. 17
      src/components/ManagerPage/EnsureGenuine.js
  3. 2
      src/components/ManagerPage/Workflow.js
  4. 2
      src/helpers/apps/installApp.js
  5. 2
      src/helpers/apps/uninstallApp.js
  6. 34
      src/helpers/common.js
  7. 6
      src/helpers/constants.js
  8. 3
      src/helpers/deviceAccess.js
  9. 13
      src/helpers/devices/getIsGenuine.js
  10. 2
      src/helpers/firmware/installFinalFirmware.js
  11. 2
      src/helpers/firmware/installOsuFirmware.js

7
src/commands/getIsGenuine.js

@ -4,10 +4,13 @@ import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import getIsGenuine from 'helpers/devices/getIsGenuine'
import { withDevice } from 'helpers/deviceAccess'
type Input = *
type Result = boolean
type Result = string
const cmd: Command<Input, Result> = createCommand('getIsGenuine', () => fromPromise(getIsGenuine()))
const cmd: Command<Input, Result> = createCommand('getIsGenuine', ({ devicePath, targetId }) =>
fromPromise(withDevice(devicePath)(transport => getIsGenuine(transport, { targetId }))),
)
export default cmd

17
src/components/ManagerPage/EnsureGenuine.js

@ -12,8 +12,14 @@ type Error = {
stack: string,
}
type DeviceInfos = {
targetId: number | string,
version: string,
}
type Props = {
device: ?Device,
infos: ?DeviceInfos,
children: (isGenuine: ?boolean, error: ?Error) => Node,
}
@ -49,12 +55,15 @@ class EnsureGenuine extends PureComponent<Props, State> {
_unmounting = false
async checkIsGenuine() {
const { device } = this.props
if (device && !this._checking) {
const { device, infos } = this.props
if (device && infos && !this._checking) {
this._checking = true
try {
const isGenuine = await getIsGenuine.send().toPromise()
if (!this.state.genuine || this.state.error) {
const res = await getIsGenuine
.send({ devicePath: device.path, targetId: infos.targetId })
.toPromise()
const isGenuine = res === '0000'
if ((!this.state.genuine || this.state.error) && isGenuine) {
!this._unmounting && this.setState({ genuine: isGenuine, error: null })
}
} catch (err) {

2
src/components/ManagerPage/Workflow.js

@ -52,7 +52,7 @@ class Workflow extends PureComponent<Props, State> {
{(device: Device) => (
<EnsureDashboard device={device}>
{(deviceInfo: ?DeviceInfo, dashboardError: ?Error) => (
<EnsureGenuine device={device}>
<EnsureGenuine device={device} infos={deviceInfo}>
{(isGenuine: ?boolean, genuineError: ?Error) => {
if (dashboardError || genuineError) {
return renderError

2
src/helpers/apps/installApp.js

@ -12,5 +12,5 @@ export default async function installApp(
transport: Transport<*>,
{ appParams }: { appParams: LedgerScriptParams },
): Promise<void> {
return createSocketDialog(transport, '/update/install', appParams)
return createSocketDialog(transport, '/install', appParams)
}

2
src/helpers/apps/uninstallApp.js

@ -17,5 +17,5 @@ export default async function uninstallApp(
firmware: appParams.delete,
firmwareKey: appParams.deleteKey,
}
return createSocketDialog(transport, '/update/install', params)
return createSocketDialog(transport, '/install', params)
}

34
src/helpers/common.js

@ -5,7 +5,7 @@ import Websocket from 'ws'
import qs from 'qs'
import type Transport from '@ledgerhq/hw-transport'
import { BASE_SOCKET_URL, APDUS } from './constants'
import { BASE_SOCKET_URL, APDUS, MANAGER_API_URL } from './constants'
type WebsocketType = {
send: (string, any) => void,
@ -24,34 +24,11 @@ export type LedgerScriptParams = {
firmwareKey?: string,
delete?: string,
deleteKey?: string,
targetId?: string | number,
}
type FirmwareUpdateType = 'osu' | 'final'
// /**
// * Install an app on the device
// */
// export async function installApp(
// transport: Transport<*>,
// { appParams }: { appParams: LedgerScriptParams },
// ): Promise<void> {
// return createSocketDialog(transport, '/update/install', appParams)
// }
/**
* Uninstall an app on the device
*/
export async function uninstallApp(
transport: Transport<*>,
{ appParams }: { appParams: LedgerScriptParams },
): Promise<void> {
return createSocketDialog(transport, '/update/install', {
...appParams,
firmware: appParams.delete,
firmwareKey: appParams.deleteKey,
})
}
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.
@ -119,11 +96,14 @@ export async function createSocketDialog(
transport: Transport<*>,
endpoint: string,
params: LedgerScriptParams,
managerUrl: boolean = false,
) {
return new Promise(async (resolve, reject) => {
try {
let lastData
const url = `${BASE_SOCKET_URL}${endpoint}?${qs.stringify(params)}`
const url = `${managerUrl ? MANAGER_API_URL : BASE_SOCKET_URL}${endpoint}?${qs.stringify(
params,
)}`
log('WS CONNECTING', url)
const ws: WebsocketType = new Websocket(url)
@ -142,6 +122,8 @@ export async function createSocketDialog(
success: msg => {
if (msg.data) {
lastData = msg.data
} else if (msg.result) {
lastData = msg.result
}
},
error: msg => {

6
src/helpers/constants.js

@ -1,10 +1,8 @@
// Socket endpoint
export const BASE_SOCKET_URL = 'ws://api.ledgerwallet.com'
export const BASE_SOCKET_URL_TEMP = 'ws://manager.ledger.fr:3500'
export const BASE_SOCKET_URL = 'ws://api.ledgerwallet.com/update'
export const MANAGER_API_URL = 'wss://api.ledgerwallet.com/update'
export const API_BASE_URL = process.env.API_BASE_URL || 'https://beta.manager.live.ledger.fr/api'
// If you want to test locally with https://github.com/LedgerHQ/ledger-update-python-api
// export const BASE_SOCKET_URL = 'ws://localhost:3001/update'
// List of APDUS
export const APDUS = {

3
src/helpers/deviceAccess.js

@ -19,7 +19,8 @@ export const withDevice: WithDevice = devicePath => {
return job =>
takeSemaphorePromise(sem, async () => {
const t = await retry(() => TransportNodeHid.open(devicePath), { maxRetry: 1 })
if (process.env.DEBUG_DEVICE) t.setDebugMode(true)
if (process.env.DEBUG_DEVICE > 0) t.setDebugMode(true)
try {
const res = await job(t)
// $FlowFixMe

13
src/helpers/devices/getIsGenuine.js

@ -1,6 +1,11 @@
// @flow
import type Transport from '@ledgerhq/hw-transport'
import { createSocketDialog } from 'helpers/common'
// import type Transport from '@ledgerhq/hw-transport'
export default async (/* transport: Transport<*> */) =>
new Promise(resolve => setTimeout(() => resolve(true), 1000))
export default async (
transport: Transport<*>,
{ targetId }: { targetId: string | number },
): Promise<*> =>
process.env.SKIP_GENUINE > 0
? new Promise(resolve => setTimeout(() => resolve('0000'), 1000))
: createSocketDialog(transport, '/genuine', { targetId }, true)

2
src/helpers/firmware/installFinalFirmware.js

@ -12,7 +12,7 @@ const buildOsuParams = buildParamsFromFirmware('final')
export default async (transport: Transport<*>, firmware: Input): Result => {
try {
const osuData = buildOsuParams(firmware)
await createSocketDialog(transport, '/update/install', osuData)
await createSocketDialog(transport, '/install', osuData)
return { success: true }
} catch (err) {
const error = Error(err.message)

2
src/helpers/firmware/installOsuFirmware.js

@ -13,7 +13,7 @@ const buildOsuParams = buildParamsFromFirmware('osu')
export default async (transport: Transport<*>, firmware: Input): Result => {
try {
const osuData = buildOsuParams(firmware)
await createSocketDialog(transport, '/update/install', osuData)
await createSocketDialog(transport, '/install', osuData)
return { success: true }
} catch (err) {
const error = Error(err.message)

Loading…
Cancel
Save